2009-11-20 58 views
1

我在數據庫課程中,講師希望我們開發電子商務應用程序。她說我們可以使用任何我們喜歡的框架,現在我們已經過了半個學期,她決定Rails做得太多,並且希望我明確地編寫我的SQL查詢。Rails自定義模型函數

所以,我想要做的是編寫我自己的函數,並將它們添加到模型中以基本上覆制已有的功能(但是使用我自己編寫的SQL)。

所以,問題則變成:

  1. 我如何執行模型中手動創建查詢?
  2. 如何將結果填充到一個空白對象中,然後我可以返回並在視圖內使用它們?

另外,我知道這是多麼可怕的做法,我只是不想從PHP開始到現在。

+0

對不起,但現在幾乎每個框架都有某種ORM - 比如看Doctrine。 ActiveRecord甚至在隱藏SQL方面做得並不出色 - 您可以將SQL作爲條件/組/連接選項的一部分編寫。 – 2009-11-20 16:15:29

+0

ActiveRecord甚至不嘗試**來隱藏SQL。閱讀Rails的創建者David Heinemeier Hansson在[Agile Web Development with Rails book]的第315頁上說過(http://event2011.googlecode.com/files/Agile_Web。pdf):「[Active Record]建立在SQL既不骯髒也不壞的概念上,只是在平凡的情況下是冗長的。重點在於消除在這些微不足道的情況下處理冗長的需要(編寫10個屬性手工插入會讓程序員感到厭倦),但保留了硬性查詢的表現力 - 類型SQL被創建用於優雅處理。「 – 2012-11-09 14:12:04

回答

4

我認爲,你應該知道2-3個非常必要的方法來使用它。 (假設我們有至少2個型號,訂單和用戶(客戶訂單)) 例如,只在你的數據庫的使用運行查詢此:

Order.connection.execute("DELETE FROM orders WHERE id = '2') 

從數據庫獲取對象的數量,最好的方法是使用方法「count_by_sql」,它是可擴展的。我在我的項目中使用它,其中表有超過500萬條記錄。所有的工作都是爲了統計應用程序給數據庫,它比應用程序更有效率。

Order.count_by_sql("SELECT COUNT(DISTINCT o.user_id) FROM orders o") 

此查詢獲取具有訂單的所有uniq用戶的數量。我們可以「加入」表格,使用「ORDER BY」和組結果排序結果。

和最經常使用的方法:的find_by_sql

Order.find_by_sql("SELECT * FROM orders") 

它返回到你的紅寶石對象的數組。

2

比方說你有購買

class Purchase < ActiveRecord:Base 
    def Purchase.find(id) 
     Purchase.find_by_sql(["Select * from purchases where id=?", id]) 
    end 
end 

也許你想要的產品爲特定購買。您可以在Purchase模型中手動定義purchased_items。

class Purchase < ActiveRecord:Base 
    def purchased_items 
     PurchasedItem.find_by_sql(["Select * from purchased_items where purchase_id=?",self.id]) 
    end 
end 

因此,例如,在你的控制器,你現在想購買的物品特定訂單現在你可以做到這一點

@purchase = Purchase.find(params[:id]) 
@purchased_items = @purchase.purchased_items 

如果您需要將數據庫更原始的連接,你可以看看ActiveRecord:Base.connection.execute(sql)