У меня есть соглашение класса, который имеет два BELONGS_TO ассоциации к классу членов, - ссылаться как на первичные и вторичные:Multiple присоединяется к одной и той же модели, используя несколько ассоциаций BELONGS_TO
class Agreement < ActiveRecord::Base
belongs_to :primary, class_name: 'Member'
belongs_to :secondary, class_name: 'Member'
...
def self.by_member(member_attribute_hash)
# returns any agreements that has a primary OR secondary member that matches any of the values
# in the member_attribute_hash
...
end
end
Класс член не имеет никакого знания ассоциации с классом соглашения - это не нужно:
class Member < ActiveRecord::Base
# contains surname, given_names, member_number
...
def self.by_any(member_attribute_hash)
# returns any member where the member matches on surname OR given_names OR member_number
...
end
end
то, что я хотел бы сделать, это поиск по всем договорам, где первичный или вторичный элемент спичек набора критериев.
Из предыдущей работы (see question #14139609), я разобрался, как построить условное предложение where для Member.by_any()
.
Попытка повторно использовать этот метод в то время как поиск Соглашений привел меня попробовать это:
class Agreement < ActiveRecord::Base
...
def self.by_member(member_attribute_hash)
Agreement.joins{primary.outer}.merge(Member.by_any(member_attribute_hash)).joins{secondary.outer}.merge(Member.by_any(member_attribute_hash))
end
end
При управлении это в консоли, с member_attribute_hash = {surname: 'Freud'}
, сгенерированный SQL не выполняет псевдоним сгенерированный для второго присоединиться члену:
SELECT "agreements".*
FROM "agreements"
LEFT OUTER JOIN "members"
ON "members"."id" = "agreements"."primary_id"
LEFT OUTER JOIN "members" "secondarys_agreements"
ON "secondarys_agreements"."id" = "agreements"."secondary_id"
WHERE "members"."surname" ILIKE 'Freud%'
AND "members"."surname" ILIKE 'Freud%'
Обратите внимание на дублирующие условия в предложении WHERE. Это вернет соглашения, в которых первичный член имеет фамилию типа «Фрейд», но игнорирует условие вторичного члена, потому что псевдоним не течет через слияние.
Любые идеи?