Ensure association preloading properly merges default scope and association conditions

Conflicts:

	activerecord/test/models/reader.rb
This commit is contained in:
Pratik Naik
2012-08-28 12:57:41 -07:00
parent 8efced68be
commit 58d35f6211
4 changed files with 25 additions and 3 deletions

View File

@@ -117,9 +117,7 @@ module ActiveRecord
conditions = klass.send(:instance_eval, &conditions)
end
if conditions
klass.send(:sanitize_sql, conditions)
end
conditions
end
end
end

View File

@@ -1010,6 +1010,18 @@ class EagerAssociationTest < ActiveRecord::TestCase
end
end
def test_preload_has_many_with_association_condition_and_default_scope
post = Post.create!(:title => 'Beaches', :body => "I like beaches!")
Reader.create! :person => people(:david), :post => post
LazyReader.create! :person => people(:susan), :post => post
assert_equal 1, post.lazy_readers.to_a.size
assert_equal 2, post.lazy_readers_skimmers_or_not.to_a.size
post_with_readers = Post.includes(:lazy_readers_skimmers_or_not).find(post.id)
assert_equal 2, post_with_readers.lazy_readers_skimmers_or_not.to_a.size
end
def test_include_has_many_using_primary_key
expected = Firm.find(1).clients_using_primary_key.sort_by(&:name)
# Oracle adapter truncates alias to 30 characters

View File

@@ -117,6 +117,7 @@ class Post < ActiveRecord::Base
has_many :readers
has_many :secure_readers
has_many :readers_with_person, :include => :person, :class_name => "Reader"
has_many :people, :through => :readers
has_many :secure_people, :through => :secure_readers
has_many :single_people, :through => :readers
@@ -128,6 +129,9 @@ class Post < ActiveRecord::Base
has_many :skimmers, :class_name => 'Reader', :conditions => { :skimmer => true }
has_many :impatient_people, :through => :skimmers, :source => :person
has_many :lazy_readers
has_many :lazy_readers_skimmers_or_not, :conditions => { :skimmer => [ true, false ] }, :class_name => 'LazyReader'
def self.top(limit)
ranked_by_comments.limit_by(limit)
end

View File

@@ -12,3 +12,11 @@ class SecureReader < ActiveRecord::Base
attr_accessible nil
end
class LazyReader < ActiveRecord::Base
self.table_name = 'readers'
default_scope where(:skimmer => true)
belongs_to :post
belongs_to :person
end