
例如,我想返回一个对象数组的加权平均值.因此,如果我有贷款对象(1,2,3)的字段数量(100,200,300)和default_rate(.1,.2,.3),那么使用正常的ActiveRecord函数Loan.find(1).amount应该返回100,Loan.find(2).default_rate应该返回.2.
但如果我有Loan.find(2,3).default_rate,我希望它返回默认费率的加权平均值,即.26.我知道我可以使用sql select语句执行此 *** 作但是如何“重载”ActiveRecord getter以允许在我在Loan对象数组而不是单个Loan对象上调用getter时定义函数?
贷款表具有字段金额ID,金额和default_rate
class Loan < ActiveRecord::Base module Collection def default_rate sum(:default_rate * :amount) / sum(:amount) end endendclass Loangroup has_many :loans,:extend => Loan::Collectionend#Then I tryobj = Loangroup.where('ID < 10') 这给了我在Loangroup中未定义has_many的错误
解决方法 为了避免使用特定于Loan记录集合的方法来污染Array的命名空间,您可以为这样的集合创建一个包装器并在其上调用您的方法.就像是:
class LoanArray < Array def initialize(*args) find(*args) end def find(*args) replace Array.wrap(Loan.find(*args)) self end def default_rate if length == 1 self[0].default_rate else inject(0) {|mem,loan| mem + loan.defualt_rate } / count end endend# thenarr = LoanArray.new(2,3).default_rate #=> 0.26arr.find(1,3).default_rate #=> 0.2arr.length #=> 3arr.find(1) #=> [<Loan ID=1>]arr.default_rate #=> 0.1arr.length #=> 1 原始答案如下:使用关联扩展名
使用关联扩展.这样,无论是贷款还是贷款集合,该方法都是相同的.
class MyClass has_many :loans do def default_rate sum(:default_rate) / count end endendobj = MyClass.find(1)obj.loans.first.default_rate #=> 0.1obj.loans.default_rate #=> 0.2obj.loans.where(:ID => [2,3]).default_rate #=> 0.26
如果你想保留贷款类贷款的逻辑,你也可以在那里写下延期,例如:
class Loan module Collection def default_rate sum(:default_rate) / count end # plus other methods,as needed,e.g. def average_amount sum(:amount) / count end endendclass MyClass has_many :loans,:extend => Loan::Collectionend
编辑:因为@Santosh指出association.find不返回关系,所以它在这里不起作用.您必须使用返回关系的where或其他方法.
总结以上是内存溢出为你收集整理的ruby-on-rails – 在一个对象数组上使用ActiveRecord getter全部内容,希望文章能够帮你解决ruby-on-rails – 在一个对象数组上使用ActiveRecord getter所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)