mirror of
https://github.com/github/rails.git
synced 2026-01-09 14:48:01 -05:00
Ensure association preloading properly merges default scope and association conditions
Conflicts: activerecord/test/models/reader.rb
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user