如何在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

第二,很难说你想做什么,因为你没有包括你的整个方法,但我假设你试图获得StockInventory的实例有一个特定的公司id和库存状态。

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)

您需要修改此方法以适应您的特定数据库列和状态,但这非常复杂。

无论如何,我建议你阅读活动记录查询接口指南-一旦你了解了它是如何工作的,你可以用它做很多事情。

最新更新