如何在Rails中调用带有模型范围的静态函数?

时间:2013-03-23 04:03:30

标签: ruby-on-rails ruby-on-rails-3 rails-activerecord

我不确定如何让它以语法方式工作。我确实让它像以下一样工作:

  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

但是,如果没有匿名函数,有没有办法呢?

1 个答案:

答案 0 :(得分:1)

首先,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类方法(这应该是一个红色标记),而是直接在{ {1}}类或任何StockInventory关系。另外,由于它是一种关系,您可以将其他ActiveRecord方法链接到它,即StockInventory

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

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