diff options
-rw-r--r-- | activerecord/lib/active_record/associations.rb | 2 | ||||
-rw-r--r-- | railties/guides/source/association_basics.textile | 50 |
2 files changed, 23 insertions, 29 deletions
diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index 11555b88e0..65daa8ffbe 100644 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -889,7 +889,7 @@ module ActiveRecord # Specifies type of the source association used by <tt>has_many :through</tt> queries where the source # association is a polymorphic +belongs_to+. # [:uniq] - # If true, duplicates will be omitted from the collection. Works only in conjunction with <tt>:through</tt>. + # If true, duplicates will be omitted from the collection. Useful in conjunction with <tt>:through</tt>. # [:readonly] # If true, all the associated objects are readonly through the association. # [:validate] diff --git a/railties/guides/source/association_basics.textile b/railties/guides/source/association_basics.textile index bc08874a30..aec1b0732d 100644 --- a/railties/guides/source/association_basics.textile +++ b/railties/guides/source/association_basics.textile @@ -1371,47 +1371,41 @@ The +:through+ option specifies a join model through which to perform the query. h6(#has_many-uniq). +:uniq+ -Specify the +:uniq => true+ option to remove duplicates from the collection. It only works with +:through+ option. +Set the +:uniq+ option to true to keep the collection free of duplicates. This is mostly useful together with the +:through+ option. <ruby> class Person < ActiveRecord::Base - has_many :readers - has_many :posts, :through => :readers - - def self.lab - person = Person.create(:name => 'john') - p = Post.create(:name => 'a1') - person.posts << p - person.posts << p - person.reload - puts person.posts.inspect #=> [#<Post id: 5, name: "a1">, #<Post id: 5, name: "a1">] - puts Reader.all.inspect #=> [#<Reader id: 12, person_id: 5, post_id: 5>, #<Reader id: 13, person_id: 5, post_id: 5>] - end + has_many :readings + has_many :posts, :through => :readings end + +person = Person.create(:name => 'john') +post = Post.create(:name => 'a1') +person.posts << post +person.posts << post +person.posts.inspect # => [#<Post id: 5, name: "a1">, #<Post id: 5, name: "a1">] +Reading.all.inspect # => [#<Reading id: 12, person_id: 5, post_id: 5>, #<Reading id: 13, person_id: 5, post_id: 5>] </ruby> -In the above case +readers+ table has two records and +person.posts+ brings out both of these records even though these records are basically pointing to the same +post+ record. +In the above case there are two readings and +person.posts+ brings out both of them even though these records are pointing to the same post. -Now let's add +uniq => true+ option. +Now let's set +:uniq+ to true: <ruby> class Person - has_many :readers - has_many :posts, :through => :readers, :uniq => true - - def self.experiment - person = Person.create(:name => 'honda') - p = Post.create(:name => 'a1') - person.posts << p - person.posts << p - person.reload - puts person.posts.inspect #=> [#<Post id: 7, name: "a1">] - puts Reader.all.inspect #=> [#<Reader id: 16, person_id: 7, post_id: 7>, #<Reader id: 17, person_id: 7, post_id: 7>] - end + has_many :readings + has_many :posts, :through => :readings, :uniq => true end + +person = Person.create(:name => 'honda') +post = Post.create(:name => 'a1') +person.posts << post +person.posts << post +person.posts.inspect # => [#<Post id: 7, name: "a1">] +Reading.all.inspect # => [#<Reading id: 16, person_id: 7, post_id: 7>, #<Reading id: 17, person_id: 7, post_id: 7>] </ruby> -In the above case +readers+ table still has two records. However +person.posts+ will show only one +post+ record because collection will load only +unique+ records. +In the above case there are still two readings. However +person.posts+ shows only one post because collection loads only unique records. h6(#has_many-validate). +:validate+ |