在activerecord关系上定义方法

Pet*_*ter 6 ruby-on-rails

我想在activerecord关系上定义一个自定义方法,例如:

Transaction.all.summed_values
Run Code Online (Sandbox Code Playgroud)

一个简单的例子是summed_values应该sum(:value)在哪里评估关系.

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

另外,如果这个新方法只对Transactions 有意义,有没有办法告诉rails只为ActiveRecord::Relations组成的Transactions 定义这个方法?

Tan*_*ili 11

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

  • 我刚刚发现使用 `class << self` 与 `def self.method_name` 不同。(对于将来阅读本文的任何人) (3认同)
  • 它起作用是因为 CollectionProxy 将未知方法委托给 Relation 的目标。请参阅 http://api.rubyonrails.org/classes/ActiveRecord/Associations/CollectionProxy.html (3认同)

小智 6

你应该使用扩展

Transaction.all.extending do
  def summed_values
    sum(:what_you_want)
  end
end
Run Code Online (Sandbox Code Playgroud)

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