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')