2011-12-06 61 views
1

我知道如何調用SQL選擇從已定義的模型數據,像這樣定義的對象:SQL調用,返回未通過模型

Friend.find_by_sql(["...."]) 

我的問題是我該怎麼辦,如果我需要的信息不是由模型定義的?

我有一個餐桌,朋友表和組件表。組件組成膳食,而朋友可能對組件過敏。我有一個SQL命令(由於保密原因,我不能在這裏發佈,但實現與此無關)返回給定一個Meal的friend_id和component_id。也就是說,它返回一列行(每列有兩列,friend_id和component_id),告訴我哪些朋友對給定餐中的哪些組件過敏。但我不知道如何將它存儲在Ruby中的變量中並訪問該信息。

給一些僞代碼給你的就是我想要做的一個想法:

@allergies_for_a_meal = ....<INSERT SQL QUERY HERE>... 
@friends_who_are_allergic = Friends.find_by_id(@allergies_for_a_meal.friend_id) 

能有人給我這種情況的正確語法的想法?

回答

0

如果您在ActiveRecord::Base子類(例如模型)中,則可通過connection訪問當前數據庫連接;該connection有一些有用的方法,如select_rows

a = connection.select_rows('select id from ...').map { |r| r[0].to_i } 

如果你不是一個模型類裏面,那麼你真的不應該直接與數據庫搞亂,但如果你必須你可以使用ActiveRecord::Base.connection

+0

好的謝謝。 a.friend_id會按預期工作嗎? – varatis

+0

@varatis:不,'a'只包含Fixnums,不包含模型實例或任何複雜的東西。 –

+0

好的,我如何訪問它們?對不起,我對Ruby非常陌生 – varatis

0

您可以在數據庫中創建一個SQL視圖,然後創建一個只讀的ActiveRecord模型來從中讀取數據。

這樣:

  • 您複雜的SQL存儲在DBMS(和解析只有一次)。
  • 可以使用所有常見的ActiveRecord的訪問器和取景器的訪問數據
  • 您可以添加額外查找制約視圖的SQL

注意一些視圖可以寫入,這取決於視圖的SQL,數據庫管理系統,引擎等,但我建議反對。