mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
parent
a57b5292b0
commit
111ccc832b
6 changed files with 41 additions and 5 deletions
|
@ -128,9 +128,9 @@ module ActiveRecord
|
|||
reflection = chain_head
|
||||
while reflection
|
||||
table = reflection.alias_name
|
||||
next_reflection = reflection.next
|
||||
|
||||
unless reflection == chain_tail
|
||||
next_reflection = reflection.next
|
||||
foreign_table = next_reflection.alias_name
|
||||
scope = next_chain_scope(scope, table, reflection, association_klass, foreign_table, next_reflection)
|
||||
end
|
||||
|
@ -138,7 +138,7 @@ module ActiveRecord
|
|||
# Exclude the scope of the association itself, because that
|
||||
# was already merged in the #scope method.
|
||||
reflection.constraints.each do |scope_chain_item|
|
||||
item = eval_scope(reflection.klass, scope_chain_item, owner)
|
||||
item = eval_scope(reflection.klass, table, scope_chain_item, owner)
|
||||
|
||||
if scope_chain_item == refl.scope
|
||||
scope.merge! item.except(:where, :includes)
|
||||
|
@ -153,14 +153,15 @@ module ActiveRecord
|
|||
scope.order_values |= item.order_values
|
||||
end
|
||||
|
||||
reflection = reflection.next
|
||||
reflection = next_reflection
|
||||
end
|
||||
|
||||
scope
|
||||
end
|
||||
|
||||
def eval_scope(klass, scope, owner)
|
||||
klass.unscoped.instance_exec(owner, &scope)
|
||||
def eval_scope(klass, table, scope, owner)
|
||||
predicate_builder = PredicateBuilder.new(TableMetadata.new(klass, table))
|
||||
ActiveRecord::Relation.create(klass, table, predicate_builder).instance_exec(owner, &scope)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -28,6 +28,9 @@ require "models/member"
|
|||
require "models/membership"
|
||||
require "models/club"
|
||||
require "models/organization"
|
||||
require "models/user"
|
||||
require "models/family"
|
||||
require "models/family_tree"
|
||||
|
||||
class HasManyThroughAssociationsTest < ActiveRecord::TestCase
|
||||
fixtures :posts, :readers, :people, :comments, :authors, :categories, :taggings, :tags,
|
||||
|
@ -1232,6 +1235,17 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase
|
|||
TenantMembership.current_member = nil
|
||||
end
|
||||
|
||||
def test_has_many_through_with_scope_should_respect_table_alias
|
||||
family = Family.create!
|
||||
users = 3.times.map { User.create! }
|
||||
FamilyTree.create!(member: users[0], family: family)
|
||||
FamilyTree.create!(member: users[1], family: family)
|
||||
FamilyTree.create!(member: users[2], family: family, token: "wat")
|
||||
|
||||
assert_equal 2, users[0].family_members.to_a.size
|
||||
assert_equal 0, users[2].family_members.to_a.size
|
||||
end
|
||||
|
||||
def test_incorrectly_ordered_through_associations
|
||||
assert_raises(ActiveRecord::HasManyThroughOrderError) do
|
||||
DeveloperWithIncorrectlyOrderedHasManyThrough.create(
|
||||
|
|
4
activerecord/test/models/family.rb
Normal file
4
activerecord/test/models/family.rb
Normal file
|
@ -0,0 +1,4 @@
|
|||
class Family < ActiveRecord::Base
|
||||
has_many :family_trees, -> { where(token: nil) }
|
||||
has_many :members, through: :family_trees
|
||||
end
|
4
activerecord/test/models/family_tree.rb
Normal file
4
activerecord/test/models/family_tree.rb
Normal file
|
@ -0,0 +1,4 @@
|
|||
class FamilyTree < ActiveRecord::Base
|
||||
belongs_to :member, class_name: "User", foreign_key: "member_id"
|
||||
belongs_to :family
|
||||
end
|
|
@ -7,6 +7,10 @@ class User < ActiveRecord::Base
|
|||
has_and_belongs_to_many :jobs_pool,
|
||||
class_name: "Job",
|
||||
join_table: "jobs_pool"
|
||||
|
||||
has_one :family_tree, -> { where(token: nil) }, foreign_key: "member_id"
|
||||
has_one :family, through: :family_tree
|
||||
has_many :family_members, through: :family, source: :members
|
||||
end
|
||||
|
||||
class UserWithNotification < User
|
||||
|
|
|
@ -329,6 +329,15 @@ ActiveRecord::Schema.define do
|
|||
create_table :eyes, force: true do |t|
|
||||
end
|
||||
|
||||
create_table :families, force: true do |t|
|
||||
end
|
||||
|
||||
create_table :family_trees, force: true do |t|
|
||||
t.references :family
|
||||
t.references :member
|
||||
t.string :token
|
||||
end
|
||||
|
||||
create_table :funny_jokes, force: true do |t|
|
||||
t.string :name
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue