我不确定如何让它以语法方式工作。我确实让它像以下一样工作:
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
但是,如果没有匿名函数,有没有办法呢?
答案 0 :(得分:1)
首先,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
类方法(这应该是一个红色标记),而是直接在{ {1}}类或任何StockInventory
关系。另外,由于它是一种关系,您可以将其他ActiveRecord方法链接到它,即StockInventory
。
您需要更改此方法以适合您的特定数据库列和状态,但这很复杂,需要获取。
无论如何,我建议您阅读Active Record Query Interface指南 - 一旦您了解它的工作原理,您就可以做很多事情。