0

我不确定如何让它在语法上正常工作。我确实让它像下面这样工作:

  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

但是,有没有办法在没有匿名函数的情况下做到这一点?

4

1 回答 1

1

首先,Ruby 中没有静态函数。这self.get_inventory是一个类方法,它实际上是Company类上的单例实例方法。该scope调用本身是一个类方法,它动态定义其他类方法,在本例中为out_of_stockin_stock

其次,很难说出您要做什么,因为您没有包含整个方法,但我假设您正在尝试获取StockInventory具有特定公司 ID 和库存状态的实例。

ActiveRecord 允许您使用finders,就像您在这里所做的那样,或者更灵活的关系,因为它们通常是可链接的,并且因为它们的执行被延迟到绝对必要时,这意味着您可以将它们传递给不同的方法而不打数据库。除非我正在查找具有已知 id 的单个对象,否则我通常会因此而坚持使用关系。

我将做一些假设,因为你的问题不是特别清楚。Company如果你定义了and之间的关系StockInventory(比如has_many :stock_inventoriesand 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).

您需要更改此方法以适合您的特定数据库列和状态,但这很复杂,因为它需要得到。

无论如何,我建议你阅读Active Record Query Interface指南——一旦你了解了它的工作原理,你可以用它做很多事情。

于 2013-03-23T04:36:14.073 回答