2012-07-21 87 views
5

定义方法,我想在一个ActiveRecord关系定义自定义方法,如:在ActiveRecord的关系

Transaction.all.summed_values 

一个简单的例子就是,summed_values应该评估的关系sum(:value)

我应该在哪里定义方法summed_values?看起来应该在ActiveRecord::Relation。如果它应该直接在那里,我应该把它放入哪个文件?

而且,如果这种新方法仅对于Transaction S,有没有办法告诉Rails只定义ActiveRecord::Relation s表示包括Transaction s此方法?

+0

您可以直接使用'sum'上的关系,像'Transaction.sum(:值)'通过的ActiveRecord ::计算提供http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html – 2016-02-15 16:01:30

回答

7

直接在事务模型中创建一个self.summed_values方法。

+0

它会工作。你也可以使用范围。 – 2012-07-21 15:25:37

+0

Tanzeeb:我的歉意。请编辑你的问题,我会删除我的downvote! – Peter 2012-07-21 22:59:22

+1

我不明白为'Transaction'添加一个类方法可以处理关系。谢谢! – Peter 2012-07-21 23:09:33

1

是否有任何特定的原因,你想创建这种方法作为ActiveRecord :: Relation的扩展?我会建议一种类似的方法:

class Transaction ... 
    def self.summed_values(transactions=nil) 
    if transactions.nil? 
     all.sum(...)... 
    else 
     where(id => transactions).sum(...)... 
    end 
    end 
end 

这也有一个好处,它只适用于交易。

+0

这不会看起来很干净,也不符合我的意思以及我之后的解决方案。我想特别调用的方法对关系对象有意义,无论是在概念上还是在实现中。我同意这可行,但这不是我所追求的。 – Peter 2012-07-21 08:24:04

+0

我不确定为什么你会喜欢ActiveRecord :: Relation对象,但它只适用于事务。唯一合乎逻辑的方法是将子类化为Relation并让Transaction使用你的子类,而我认为这种方法不会更清晰。 – 2012-07-21 15:27:39

+0

我以前不明白这是如何工作的,并没有意识到你可以添加一个类方法到'Transaction'并且它可以处理关系。感谢您帮助我理解... – Peter 2012-07-21 23:10:09

1

你应该使用延长

Transaction.all.extending do 
    def summed_values 
    sum(:what_you_want) 
    end 
end 

欲了解更多信息:ActiveRecord::QueryMethods