提交 e17979e4 编写于 作者: R Rafael Mendonça França

Merge pull request #12664 from jetthoughts/12242_includes_in_through_association

Skip `include_values` from through associations chains for building association scope
* Do not add to scope includes values from through associations.
Fixed bug when providing `includes` in through association scope, and fetching targets.
Example:
class Vendor < ActiveRecord::Base
has_many :relationships, -> { includes(:user) }
has_many :users, through: :relationships
end
vendor = Vendor.first
# Before
vendor.users.to_a # => Raises exception: not found `:user` for `User`
# After
vendor.users.to_a # => No exception is raised
Fixes: #12242, #9517, #10240
*Paul Nikitochkin*
* Type cast json values on write, so that the value is consistent
with reading from the database.
......
......@@ -78,7 +78,8 @@ def add_constraints(scope)
scope = scope.joins(join(foreign_table, constraint))
end
klass = i == 0 ? self.klass : reflection.klass
is_first_chain = i == 0
klass = is_first_chain ? self.klass : reflection.klass
# Exclude the scope of the association itself, because that
# was already merged in the #scope method.
......@@ -89,7 +90,10 @@ def add_constraints(scope)
scope.merge! item.except(:where, :includes, :bind)
end
scope.includes! item.includes_values
if is_first_chain
scope.includes! item.includes_values
end
scope.where_values += item.where_values
scope.order_values |= item.order_values
end
......
......@@ -1085,4 +1085,8 @@ def test_has_many_through_obeys_order_on_through_association
readers(:michael_authorless).update(first_post_id: 1)
assert_equal [posts(:thinking)], person.reload.first_posts
end
def test_has_many_through_with_includes_in_through_association_scope
posts(:welcome).author_address_extra_with_address.to_a
end
end
......@@ -65,6 +65,9 @@ def greeting
has_many :author_favorites, :through => :author
has_many :author_categorizations, :through => :author, :source => :categorizations
has_many :author_addresses, :through => :author
has_many :author_address_extra_with_address,
through: :author_with_address,
source: :author_address_extra
has_many :comments_with_interpolated_conditions,
->(p) { where "#{"#{p.aliased_table_name}." rescue ""}body = ?", 'Thank you for the welcome' },
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册