2014-01-07 94 views
3

我想使用find_by_sql方法代替活動記錄查詢接口,因爲我在編寫自己的SQL時獲得了靈活性。Rails - find_by_sql vs活動記錄查詢

例如,

  1. 它被認爲是在SQL一個很好的做法在查詢訂購表從最小到最大。在使用活動記錄查詢接口時,您必須從可能是最大表格的結果模型開始。

  2. 我也可以很容易地通過在所述目標表連接本身和包括從多個表中所需的列避免N + 1的問題。

    我想知道是否有原因,我不應該使用的find_by_sql選項,特別是當我會寫ANSI SQL,應該是與所有兼容的,如果不是大多數的數據庫。

謝謝!

+0

在處理了數百萬行數據之後,我決定花時間編寫自己的SQL進行優化是不值得的。 ActiveRecrod已經足夠好了,對於我來說,有好幾百萬行數據對我來說足夠好。 –

+0

好的,謝謝。例如,當您使用includes時,它會在IN子句後面創建另一個SQL。 AFAIK,使用「where IN」應該創建桌面掃描,因此不鼓勵。 –

回答

9

編寫SQL代碼直接通常不鼓勵,因爲它會阻止你訪問的功能,如SQL查詢的懶惰執行,且有可能導致無效或不安全的查詢。實際上,ActiveRecord會自動將Ruby對象轉換爲相應的SQL語句(例如將範圍轉換爲BETWEEN或將數組轉換爲IN),從SQL注入過濾字符串,並且ActiveRecord :: Relations提供惰性查詢執行。

這就是說,如果你知道你正在做或使用ActiveRecord將是極其複雜的,以實現特定的查詢什麼,有什麼錯寫你的SQL。

我的建議是避免對可以在ActiveRecord和AREL中輕鬆複製的查詢執行此操作。

+0

我以爲AR查詢界面在幕後使用AREL。 AREL是否提供比查詢界面更多的功能? –

+0

ActiveRecord使用AREL,但它不公開所有功能。例如,在Rails 4之前,不可能通過ActiveRecord在使用OR的情況下加入不同的條件,但在AREL中可以使用OR。 –