2013-03-23 44 views
0

我不知道如何让它工作在语法上。我确实得到它的工作如下但:如何在Rails中调用模型范围的静态函数?

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

首先,Ruby中没有静态函数。 self.get_inventory是一个类方法,它实际上是Company类中的单例实例方法。调用本身是一个类方法,可以动态定义其他类方法,在这种情况下为out_of_stockin_stock。第二,很难说出你想要做什么,因为你没有包括你的整个方法,但是我假设你试图获得具有特定公司ID的StockInventory的实例,库存状态。

的ActiveRecord允许您使用发现者,因为它似乎你已经在这里做了,或者关系,这是一个更灵活一点,因为他们通常是可链接的,因为它们的执行被延迟,直到绝对必要的,这意味着您可以将它们传递给不同的方法而不需要访问数据库。除非我用已知的身份证查找单个对象,否则我通常会因为这个原因而坚持关系。

我打算做一些假设,因为你的问题不是特别清楚。如果您已经定义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指南 - 一旦你了解它的工作原理,你可以用它做很多事情。

+0

你错过的一件事是,那些[可怕和讨厌的动态查找方法](http://edgeguides.rubyonrails.org/4_0_release_notes.html#active-record- deprecation)已被弃用,用明智的'where'替换它们,电话(正如你所做的)是正确的事情。 – 2013-03-23 04:37:54

+0

哇,很高兴听到有关发现者。展望未来! – 2013-03-23 04:40:18