通过Ruby on Rails中的嵌套ID和值组合过滤activerecord

时间:2015-09-16 10:14:57

标签: ruby-on-rails ruby activerecord filtering

假设我有两个具有多对多关系的模型:项目财产

现在我有一个属性数组,我想过滤属性与给定值匹配的所有项(假设一个布尔值:property.value = true)

当我尝试

@items = Item.includes(:properties).where(:properties => {:id => [1,2,3].to_a, :value => true})

我想得到属性(1)为真的所有项目 AND 属性(2)为真,依此类推。但是通过上面的代码,我获得了与属性ID相关的所有项目以及任何属性为true的位置。我该如何更改我的代码?

我很感激不要使用宝石。

1 个答案:

答案 0 :(得分:1)

看起来你差不多了:

property_ids = [1,2,3]
Item.joins(:properties).
     where(:properties => { :id => property_ids, :value => true }).
     group('items.id').
     having('COUNT(properties.id) >= ?', property_ids.size)
当您确实需要加入表时,

joins执行INNER JOIN并优先于includes

where基本上就是你已经拥有的条件,唯一的变化就是不需要在数组上调用to_a

比必须group在SQL中使COUNT工作。

having提取至少具有与条件匹配的预期数量的属性行的行。