使用通过关联过滤逻辑

时间:2016-01-26 08:15:57

标签: ruby-on-rails

我有BikeCategory个型号。通过BikeFilter模型自行车has_many类别。

问题是,从搜索到我得到了5个不同的类别,我只需要找到这些自行车,其中BikeFilter表中包含所有这5个类别的记录。

如果我在mysql中执行GROUP BY,它还会选择在bike_filters中只有1个或几个类别的记录。并且需要谁只拥有所有这些。

Bike.rb

has_many :bike_filters
has_many :categories, :through => :bike_filters

BikeFilter.rb

belongs_to :category
belongs_to :bike

1 个答案:

答案 0 :(得分:3)

您可以使用having子句: http://guides.rubyonrails.org/active_record_querying.html#having

并执行以下操作:

Bike.select("bikes.*, count(*) as num_of_categories")
  .joins(:categories)
  .where(categories: { id: cats })
  .group("bikes.id")
  .having("num_of_categories = ?", cats.length)

此查询将首先执行Bikes和Categories之间的内部连接(通过BikeFilter表),然后它将仅选择category {id包含在cats数组中的行。 此时,查询将根据自行车ID对所有记录进行分组,并仅返回行数等于类别数的组。

几个笔记:

  • 仅当(bike_id,category_id)对在BikeFilter表中唯一时才会有效。
  • 此查询将返回与所有给定类别相关联的所有自行车,无论他们是否有与之关联的其他类别。