我有一个名为Color
的模型和一个名为Item
的模型。它们由表item_colors
加入。
我有一些blue
项,有些是red
,有些是blue and red
通过关联。
如果我有这样的数组:array = [:red, :blue]
我想获得具有red
颜色和blue
颜色的所有项目,但我尝试的每个查询都会返回具有red
或blue
颜色的项目
如何将查询限制为AND
,以便排除那些与数组中所有颜色不匹配的查询?
由于
答案 0 :(得分:1)
使用自定义SQL查询创建范围。
class Item < ActiveRecord::Base
has_many :item_colors
has_many :colors, through: :item_colors
scope :find_by_colors, -> (*colors) do
find_by_sql ["SELECT items.id, items.name FROM item_colors INNER JOIN items ON item_colors.item_id = items.id INNER JOIN colors ON item_colors.color_id = colors.id WHERE colors.name IN (?) GROUP BY items.name HAVING COUNT(item_colors.id) = ?;", colors, colors.count]
end
end
使用范围。
Item.find_by_colors("red", "blue")