我遇到的情况,我有SQL的地方加入查询链,然后在另外一些时候,我需要追加哪些需要同样的加入条件,但我不知道这一点是否该连接已经存在于范围内。例如:避免重复在Rails的ActiveRecord的查询连接
@foo = Foo.joins("INNER JOIN foos_bars ON foos_bars.foo_id = foos.id")
....
@foo.joins(:bars).where(bars: { id: 1 })
这将产生有关重复表/别名的SQL错误。
我写的SQL之所以在一审手动加入是改善经典的轨道AREL连接将产品两个内连接凡在我来说,我只需要一个效率。
有没有解决这个推荐的方法是什么?例如,查看当前在范围内的联接的一些方法。
回应评论:
随着has_and_belongs_to_many
关系的Rails产生两个INNER JOINS
这样的:
SELECT "journals".* FROM "journals"
INNER JOIN "categories_journals"
ON "categories_journals"."journal_id" = "journals"."id"
INNER JOIN "categories"
ON "categories"."id" = "categories_journals"."category_id"
WHERE "categories"."id" = 1
而我相信我能做到这一点,而不是:
SELECT "journals".* FROM "journals"
INNER JOIN "categories_journals"
ON "categories_journals"."journal_id" = "journals"."id"
WHERE "categories_journals"."category_id" = 1
纠正我,如果我错了。
你做了什么样的分析,证明做加入的你更“有效”的方式实际上是更好?其实,是什么让你觉得你只需要一个连接?即使您反复尝试反复加入同一张表,AREL也不会建立不必要的连接。 – messick
我更新了我的问题,因为评论@messick太长了。 –
我建议让AREL做它的事情。您的解决方案正在击败ORM的一个主要优点,它是'自动'具有映射到数据库表的对象的。如果加入到Categories表格真的是一个性能问题,我会回头想想Rails是否真的是你想要使用的东西。 – messick