【问题标题】:How do I call a static function with model scopes in Rails?如何在 Rails 中调用具有模型范围的静态函数?
【发布时间】:2013-03-23 04:03:30
【问题描述】:

我不确定如何让它在语法方面发挥作用。我确实让它像下面这样工作:

  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-on-rails ruby-on-rails-3 rails-activerecord


    【解决方案1】:

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

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

    ActiveRecord 允许您使用 finders,就像您在这里所做的那样,或 relations,它们更灵活一些,因为它们通常是可链接的,并且因为它们的执行被延迟到绝对必要时,这意味着您可以将它们传递给不同的方法而无需访问数据库。除非我正在查找具有已知 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)

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

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

    【讨论】:

    • 您错过的一件事是那些horrific and nasty dynamic finder methods 已被弃用,用明智的where 调用(正如您所做的那样)替换它们是正确的做法。
    • 哇,很高兴听到发现者的消息。走向未来!
    猜你喜欢
    • 2015-01-20
    • 2020-06-21
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多