我遇到的情況,我有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