假设我有两个具有多对多关系的模型:项目和财产
现在我有一个属性数组,我想过滤属性与给定值匹配的所有项(假设一个布尔值:property.value = true)
当我尝试
时@items = Item.includes(:properties).where(:properties => {:id => [1,2,3].to_a, :value => true})
我想得到属性(1)为真的所有项目 AND 属性(2)为真,依此类推。但是通过上面的代码,我获得了与属性ID相关的所有项目以及任何属性为true的位置。我该如何更改我的代码?
我很感激不要使用宝石。
答案 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
提取至少具有与条件匹配的预期数量的属性行的行。