我有兩個belongs_to的協會會員類的類協議連接到相同型號 - 引用爲原發性和繼發性:多使用多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),我已經整理了如何爲Member.by_any()
構建條件where子句。
試圖重新使用方法,同時尋求協議使我試試這個:
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子句中的重複條件。這將返回主要成員姓氏如「弗洛伊德」的協議,但會忽略次要成員條件,因爲別名不通過合併。
任何想法?