diff --git a/lib/mongoid/sorted_relations.rb b/lib/mongoid/sorted_relations.rb index 079fc75..a31918b 100644 --- a/lib/mongoid/sorted_relations.rb +++ b/lib/mongoid/sorted_relations.rb @@ -8,11 +8,9 @@ def self.included(base) def freeze_relation_ids @cache_sorted_documents = {} - @cache_sorted_ids = {} self.relations.each do |k,v| if [:references_many, :references_and_referenced_in_many].include? v.macro - @cache_sorted_ids[v.key] = [self.send(v.key)].flatten.map{ |rid| rid.to_s } self.class.send(:define_method, "sorted_#{v.name}") { sorted_relation v } end end @@ -20,7 +18,7 @@ def freeze_relation_ids def sorted_relation(relation) if not @cache_sorted_documents[relation.name] - documents = self.send(relation.name).sort_by { |x| @cache_sorted_ids[relation.key].index(x.id.to_s) } + documents = self.send(relation.name).sort_by { |x| self.send(relation.key).index(x.id) } @cache_sorted_documents[relation.name] = Mongoid::FakeCriteria.new(documents) end diff --git a/spec/mongoid/sorted_relations_spec.rb b/spec/mongoid/sorted_relations_spec.rb index bb81f04..ccd40c2 100644 --- a/spec/mongoid/sorted_relations_spec.rb +++ b/spec/mongoid/sorted_relations_spec.rb @@ -9,6 +9,21 @@ before { book.save and book.reload } the("book.sorted_authors.map(&:name)") { should eql ['Sun Tzu', 'Sun Wu', 'Lao Zi'] } + end end + + context "modifying a loaded model" do + let (:book) {Book.new(:title => 'The Art of War')} + + it "enables sorting on a preloaded model" do + author1 = Author.create(:name => 'auth1') + author2 = Author.create(:name => 'auth2') + book.authors << author2 + book.authors << author1 + book.sorted_authors.map(&:name).should eql ['auth2', 'auth1'] + end + + end + end