我不确定如何让它在语法方面工作。我确实让它像下面这样工作:
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_stock
和in_stock
。
第二,很难说你想做什么,因为你没有包括你的整个方法,但我假设你试图获得StockInventory
的实例有一个特定的公司id和库存状态。
ActiveRecord允许您使用查找器,就像您在这里所做的那样,或者关系,这更灵活一些,因为它们通常是可链接的,并且因为它们的执行延迟到绝对必要时,这意味着您可以将它们传递给不同的方法而无需触及数据库。除非我正在查找具有已知id的单个对象,否则出于这个原因,我通常坚持使用关系。
既然你的问题不是特别清楚,我将做一些假设。如果您已经定义了Company
和StockInventory
之间的关系(如has_many :stock_inventories
和belongs_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)
。
您需要修改此方法以适应您的特定数据库列和状态,但这非常复杂。
无论如何,我建议你阅读活动记录查询接口指南-一旦你了解了它是如何工作的,你可以用它做很多事情。