大家好,这是我的代码:
class Tailor < ActiveRecord::Base
has_many :tailor_items
has_many :order_items
[:collars, :sexes, :sleeves].each do |attribute|
has_many attribute, through: :tailor_items, source: :item, source_type: attribute.to_s.classify
end
end
class TailorItem < ActiveRecord::Base
belongs_to :tailor
belongs_to :item, polymorphic: true
end
class Collar < ActiveRecord::Base
end
我需要做的是:对于给定的衬衫,我需要选择裁缝。衬衫可以有领子,男/女或某种类型的袖子。一些裁缝可以制作所有的领子,但只能制作几个袖子,其他裁缝只能制作男性的东西,等等。对于这个例子,优先级无关紧要。这个想法是我最终得到了 1 个裁缝。
我试过这个:
tailors = Tailor.joins(:tailor_items).where("(item_id = ? and item_type = ?)",1,"Collar")
if tailors.count > 1
tailors.where("(item_id = ? and item_type = ?)",2,"Sleeve")
if tailors.count > 1
# and so forth.
end
end
但我从来没有得到一排回来。如果我说:
Tailor.find(1).tailor_items
我得到两个结果(为简单起见,sudo 代码)
<id: 1, item_type: "Collar"><id:2, item_type:"Sleeve">
对于第二个裁缝:
Tailor.find(2).tailor_items
我得到两个结果(为简单起见,sudo 代码)
<id: 1, item_type: "Collar"><id:3, item_type:"Sleeve">
但是当我尝试将它们链接到查询中时,它不起作用......即使我把它们全部放在一个地方:
Tailor.where("(item_id = 1 and item_type = 'Collar') and (item_id = 2 and item_type = 'Sleeve')")
我仍然得到 0 个结果。
Tailor.where("item_id = 1 and item_type = 'Collar'") returns: Tailor #1
Tailor.where("item_id = 2 and item_type = 'Sleeve'") returns: Tailor #1
但他们一起没有回报。
Tailor Load (0.0ms) SELECT "tailors".* FROM "tailors" INNER
JOIN "tailor_items" ON "tailor_items"."tailor_id" = "tailors"."id" WHERE ((tailo
r_items.item_id = 1 and tailor_items.item_type = 'Collar') and (tailor_items.ite
m_id = 2 and tailor_items.item_type = 'Sleeve'))
我很困惑..
谢谢你的帮助。
我运行:Win XP Postgresql Rails 3.2.2
PS:在多态连接之后唯一缺少的就是一点 XML。:P 否则它只是不够企业化..
编辑:实施 Rob di Marcos 范围,我得到这个 SQL:
SELECT "tailors".* FROM "tailors" WHERE
(EXISTS(SELECT * FROM tailor_items WHERE tailor_items.item_id = 1 and tailor_items.item_type = 'Collar'))
AND (exists(select * from tailor_items where tailor_items.item_id = 2 and tailor_items.item_type = 'Sleeve'))
这将返回 2 名裁缝,而不是只有 1 名可以同时做的裁缝(而裁缝 2 不能做袖子 #2)