Ruby on rails Rails:Postgresql,其中具有多个条件和连接(多态)
大家好,这是我的代码:Ruby on rails Rails:Postgresql,其中具有多个条件和连接(多态),ruby-on-rails,ruby-on-rails-3,postgresql,activerecord,join,Ruby On Rails,Ruby On Rails 3,Postgresql,Activerecord,Join,大家好,这是我的代码: 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: attri
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
但是我再也没有吵架了。
如果我说:
Tailor.find(1).tailor_items
我得到了两个结果(简单的sudo代码)
我得到了两个结果(简单的sudo代码)
我仍然得到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'))
我很困惑
谢谢你的帮助
我运行:
赢XP
Postgresql
轨道3.2.2
PS:在多态连接之后,唯一缺少的是一点XML否则,这还不够进取
编辑:
通过实施Rob di Marcos scope,我得到以下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)问题是,where需要在两排上匹配。我通常会使用子查询来测试这一点。大概是
Tailor.where("exists (select 'x' from tailor_items where
tailor_id = tailors.id and tailor_items.item_id = ? and
tailor_items.item_type=?)", 1, 'Collar').
where("exists (select 'x' from tailor_items where
tailor_id = tailors.id and tailor_items.item_id = ? and
tailor_items.item_type=?)", 2, 'Sleeve')
在本例中,对于我要查找的每个定制项目,我都有一个子查询。我可以很容易地在裁缝身上做一个范围,比如:
class Tailor
# ....
scope :with_item, lambda{ |item_id, item_type |
where("exists (select 'x' from tailor_items where
tailor_id = tailors.id and tailor_items.item_id = ? and
tailor_items.item_type=?)", item_id, item_type)
}
然后就可以限制我的裁缝要求
Tailor.with_item(1, 'Collar').with_item(2, 'Sleeve')
好的,我确实让你的范围工作了,最后缺少了一个)。但现在的问题是它返回的结果太多。Tailor1有套环1,套筒1,Tailor2有套环1,套筒1。如果我这样做了:裁缝。使用项目(1,“衣领”)。使用项目(1,“性别”)返回裁缝1和裁缝2。但是我只想要裁缝2。你能在日志中查找并发布为select生成的SQL吗?我编辑了我的问题以包含SQL。谢谢你的帮助。噢,我明白了,你缺少范围“tailor\u id=tailors.id”中的一部分,该部分将exists查询限制为仅与裁缝相关的项目。你赢得了今天的Internet,我的朋友。非常感谢您的帮助:)
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'))
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'))
Tailor.where("exists (select 'x' from tailor_items where
tailor_id = tailors.id and tailor_items.item_id = ? and
tailor_items.item_type=?)", 1, 'Collar').
where("exists (select 'x' from tailor_items where
tailor_id = tailors.id and tailor_items.item_id = ? and
tailor_items.item_type=?)", 2, 'Sleeve')
class Tailor
# ....
scope :with_item, lambda{ |item_id, item_type |
where("exists (select 'x' from tailor_items where
tailor_id = tailors.id and tailor_items.item_id = ? and
tailor_items.item_type=?)", item_id, item_type)
}
Tailor.with_item(1, 'Collar').with_item(2, 'Sleeve')