我有一张桌子叫cherry_picker_cherries
这些记录多态地属于一个称为Pickable
的模型。对于同一个pickable,它们可以在表中有多个条目,但总是有不同的cherry_pick_id
。
我的问题是:我有一个叫做Favorite Tree
的樱桃采摘器和一个叫做Favorite Fruit
的单独的樱桃采摘器我希望能够通过多个cherry picks过滤一组pickable例如,我想找到所有的pickable,它们有一个最喜欢的树cherry
和一个最喜欢的水果orange
。
我可以用下面的方法来完成这个任务:CherryPicker::Cherry.find_by_sql("SELECT * from cherry_picker_cherries t1 JOIN cherry_picker_cherries t2 USING(pickable_id) WHERE t1.value = 'orange'AND t2.value = 'cherry'")
然而,这种方法有几个缺点它不能处理更多的樱桃,现在只有两个另外,结果集被转换成一个数组,但我需要返回一个activerecord关系,以便我可以继续将方法链接到它上。
我试着看看AREL是否有某种解决方案来生成一个与上面匹配的简单查询,但是我陷入了死胡同循环遍历参数散列将非常容易,从而允许筛选2、3、4或X个cherry picks。
在AREL,rails或者其他什么地方都有可能吗?
最佳答案
你能试试吗?CherryPicker::Cherry.joins("join cherry_picker_cherries t2 using(pickable_id)").where("cherry_picker_cherries.value = ? and t2.value = ?", 'orange', 'cherry')
如果这有效,您可以迭代您想要加入的结果,并使用递增的变量名(t3,t4..)执行另一个joins
。等等),因为sql查询在需要时才会执行。
下面是如何将同一个表在自身上多次联接:
arr = ['orange', 'cherry', 'apple']
query = CherryPicker::Cherry.joins("join cherry_picker_cherries t0 using(pickable_id)")
arr.drop(2).each_with_index do |e,i|
query = query.joins("join cherry_picker_cherries t#{i+1} using(pickable_id)")
end
您也可以这样做来生成
如果你能提出一些修改建议,我会很高兴的,这样我就可以改进这篇文章了,因为如果没有你的表,很难进行测试