如何将ActiveRecord查询限制为数组中的ALL?

时间:2015-05-04 01:51:43

标签: sql ruby-on-rails activerecord

我有一个名为Color的模型和一个名为Item的模型。它们由表item_colors加入。

我有一些blue项,有些是red,有些是blue and red通过关联。

如果我有这样的数组:array = [:red, :blue]

我想获得具有red颜色和blue颜色的所有项目,但我尝试的每个查询都会返回具有redblue颜色的项目

如何将查询限制为AND,以便排除那些与数组中所有颜色不匹配的查询?

由于

1 个答案:

答案 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")