2013-03-23 73 views
0

我不知道如何讓它工作在語法上。我確實得到它的工作如下但:如何在Rails中調用模型範圍的靜態函數?

scope :out_of_stock, lambda{ |company| get_inventory(company, 'out_of_stock') } 
    scope :in_stock, lambda{ |company| get_inventory(company, 'in_stock') } 


    def self.get_inventory(company, stock_status) 
    StockInventory.find_all_by_.... 
    end 

但是,有沒有辦法做到這一點,沒有匿名功能?

回答

1

首先,Ruby中沒有靜態函數。 self.get_inventory是一個類方法,它實際上是Company類中的單例實例方法。調用本身是一個類方法,可以動態定義其他類方法,在這種情況下爲out_of_stockin_stock。第二,很難說出你想要做什麼,因爲你沒有包括你的整個方法,但是我假設你試圖獲得具有特定公司ID的StockInventory的實例,庫存狀態。

的ActiveRecord允許您使用發現者,因爲它似乎你已經在這裏做了,或者關係,這是一個更靈活一點,因爲他們通常是可鏈接的,因爲它們的執行被延遲,直到絕對必要的,這意味着您可以將它們傳遞給不同的方法而不需要訪問數據庫。除非我用已知的身份證查找單個對象,否則我通常會因爲這個原因而堅持關係。

我打算做一些假設,因爲你的問題不是特別清楚。如果您已經定義CompanyStockInventory(如has_many :stock_inventoriesbelongs_to :company)之間的關係,你可以使用這種關係爲出發點,並在StockInventory類中定義這樣的方法:

def self.in_stock 
    where(stock_status: "in stock") # or whatever 
end 

注意,而不是傳遞作爲Company類方法的參數的Company實例最終加載其他類(這應該是紅旗),您可以直接在StockInventory類或任何StockInventory關係上調用此實例。此外,由於它是一種關係,因此您可以將其他ActiveRecord方法鏈接到它,即my_company.stock_inventories.in_stock.limit(10)

你需要改變這個方法來適應你的特定數據庫列和狀態,但是這是非常複雜的,因爲它需要得到。

無論如何,我建議你閱讀Active Record Query Interface指南 - 一旦你瞭解它的工作原理,你可以用它做很多事情。

+0

你錯過的一件事是,那些[可怕和討厭的動態查找方法](http://edgeguides.rubyonrails.org/4_0_release_notes.html#active-record- deprecation)已被棄用,用明智的'where'替換它們,電話(正如你所做的)是正確的事情。 – 2013-03-23 04:37:54

+0

哇,很高興聽到有關發現者。展望未來! – 2013-03-23 04:40:18