提交 98e69078 编写于 作者: J Jan Habermann

Properly handle scoping with has_many :through. Fixes #14537.

上级 165d93b2
......@@ -14,9 +14,14 @@ module ThroughAssociation #:nodoc:
def target_scope
scope = super
chain.drop(1).each do |reflection|
relation = if reflection.scope
reflection.klass.all.instance_eval(&reflection.scope)
else
reflection.klass.all
end
scope.merge!(
reflection.klass.all.
except(:select, :create_with, :includes, :preload, :joins, :eager_load)
relation.except(:select, :create_with, :includes, :preload, :joins, :eager_load)
)
end
scope
......
......@@ -1105,4 +1105,16 @@ def test_has_many_through_obeys_order_on_through_association
def test_has_many_through_with_includes_in_through_association_scope
assert_not_empty posts(:welcome).author_address_extra_with_address
end
def test_has_many_through_unscope_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 2, post.people.to_a.size
assert_equal 1, post.lazy_people.to_a.size
assert_equal 2, post.lazy_readers_unscope_skimmers.to_a.size
assert_equal 2, post.lazy_people_unscope_skimmers.to_a.size
end
end
......@@ -144,6 +144,10 @@ def add_joins_and_select
has_many :lazy_readers
has_many :lazy_readers_skimmers_or_not, -> { where(skimmer: [ true, false ]) }, :class_name => 'LazyReader'
has_many :lazy_people, :through => :lazy_readers, :source => :person
has_many :lazy_readers_unscope_skimmers, -> { skimmers_or_not }, :class_name => 'LazyReader'
has_many :lazy_people_unscope_skimmers, :through => :lazy_readers_unscope_skimmers, :source => :person
def self.top(limit)
ranked_by_comments.limit_by(limit)
......
......@@ -15,6 +15,8 @@ class SecureReader < ActiveRecord::Base
class LazyReader < ActiveRecord::Base
self.table_name = "readers"
default_scope -> { where(skimmer: true) }
scope :skimmers_or_not, -> { unscope(:where => :skimmer) }
belongs_to :post
belongs_to :person
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册