2013-09-25 101 views
1

In rails-Model.find_by_sql vs connection.query,哪一個更好?

我需要對數據庫執行sql查詢;該查詢與任何特定模型無關,它可以混合來自多個表或其他表的數據。我有辦法做到這一點= -

  • 首先是通過執行查詢agains模式和拍攝像這個 -

    1. RES結果= User.find_by_sql(「客戶選擇*連接和條件」 )
    2. 解析度= User.find_by_sql( 「SELECT * FROM [其他表]連接和條件」)

問題的本方法,我不舒服,因爲在用戶類對象我捕獲其他表的數據。就像第一個查詢結果具有來自客戶表的數據,因此在用戶對象中我獲得了客戶的屬性。而更有趣的問題是 - 如果生成的查詢具有id屬性,那麼

res.first.id將是客戶ID, 如果用戶模型與UserRoles模型有關係,並且我使用res.first.roles訪問此關係那麼它將從UserRole中獲取用於客戶ID的角色,這是完全錯誤的。

而且可能還有問題。

所以我認爲它有很多混亂。我們不需要處理連接,結果就是一個對象數組。因此使用res.first.id訪問對象屬性更容易,比如row [「id」]。

  • 和第二種方法使用ActiveRecord連接,並執行像

查詢此res = ActiveRecord::Base.connection.query("sql query") 到位的查詢,我們可以使用select_one,SELECT_ALL並且還可以使查詢參數化的。

它存在的問題是它返回散列數組,但我需要對象數組以方便在代碼中訪問。所以我寫了一個類來將散列轉換爲對象(我認爲導軌在後臺執行相同的操作)並且工作正常。

所以我需要一些建議,既需要方法,也需要決定哪一個更好。

+0

有你加入嘗試,包括對這種類型的查詢? –

+0

如果您的意思是User.join(:table),那麼我們只需要執行sql。不要在rails模型上使用join。 – Kavi

+0

您應該嘗試使用連接方法構建查詢。例如:Customer.joins(:model_name).where(some_condition) –

回答

2

首先的find_by_sql VS SELECT_ALL

的find_by_sql,該方法通過啓動其返回對象的數組。

users = User.find_by_sql("SELECT * FROM users"); #=> [#, #, #, # ....] 


Accessing properties 
users[0].name #Getting property in object oriented fashion 

SELECT_ALL,此方法返回對象的數組,但不啓動它們,並且每個對象表示數據庫的行。

users = User.connection.select_all("SELECT * FROM users"); #=> # 

Accessing properties 
users[0]["name"] #Getting property in non-object oriented fashion 

無論是的find_by_sql更好,因爲它是自定義查詢的簡單方法到數據庫,並返回實例化的對象