mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
expanding on :uniq option in has_many
This commit is contained in:
@@ -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. Useful in conjunction with <tt>:through</tt>.
|
||||
# If true, duplicates will be omitted from the collection. Works only in conjunction with <tt>:through</tt>.
|
||||
# [:readonly]
|
||||
# If true, all the associated objects are readonly through the association.
|
||||
# [:validate]
|
||||
|
||||
@@ -1371,7 +1371,47 @@ 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. This is most useful in conjunction with the +:through+ option.
|
||||
Specify the +:uniq => true+ option to remove duplicates from the collection. It only works with +: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
|
||||
end
|
||||
</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.
|
||||
|
||||
Now let's add +uniq => true+ option.
|
||||
|
||||
<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
|
||||
end
|
||||
</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.
|
||||
|
||||
h6(#has_many-validate). +:validate+
|
||||
|
||||
|
||||
Reference in New Issue
Block a user