簡體   English   中英

如何在Rails中使用模型范圍調用靜態函數?

[英]How do I call a static function with model scopes in 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

但是,有沒有匿名功能的方法嗎?

首先,Ruby中沒有靜態函數。 self.get_inventory是一個類方法,實際上是Company類上的單例實例方法。 scope調用本身就是一個類方法,它動態定義其他類方法,在這種情況下為out_of_stockin_stock

其次,由於您沒有包括整個方法,因此很難說出您要執行的操作,但是我假設您正在嘗試獲取具有特定公司ID和庫存狀態的StockInventory實例。

ActiveRecord允許您使用查找器 (如您在此處所做的那樣)或關系 ,因為它們通常是可鏈接的,所以它們更靈活一些,因為它們的執行被延遲到絕對必要,這意味着您可以將它們傳遞給其他對象方法,而無需訪問數據庫。 除非我要查找具有已知ID的單個對象,否則通常會出於這種原因堅持使用關系。

我將作一些假設,因為您的問題不是特別清楚。 如果您已定義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指南-了解它的工作原理后,您可以做很多事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM