我在RoR中遇到了一些我正在设置的模型方法的问题。我正在尝试在一个模型上构建一个方法,其中一个参数提供了一个默认值(nil)。理想的情况是,如果将值传递给方法,它将执行除默认行为之外的其他操作。这是设置:
我目前有四种型号:Market,Deal,Merchant和BusinessType
协会看起来像这样:
class Deal
belongs_to :market
belongs_to :merchant
end
class Market
has_many :deals
has_many :merchants
end
class Merchant
has_many :deals
belongs_to :market
belongs_to :business_type
end
class BusinessType
has_many :merchants
has_many :deals, :through => :merchants
end
我试图根据业务类型提取一些数据(为了简洁起见,我已大大简化了回报):
class BusinessType
def revenue(market=nil)
if market.nil?
return self.deals.sum('price')
else
return self.deals(:conditions => ['market_id = ?',market]).sum('price')
end
end
end
所以,如果我这样做:
puts BusinessType.first.revenue
我得到了预期的结果,即与该业务类型相关的所有交易的价格总和。但是,当我这样做时:
puts BusinessType.first.revenue(1)
它仍然返回所有交易的总价,而不是来自市场1的所有交易的总价。我也尝试过:
puts BusinessType.first.revenue(market=1)
也没有运气。
我错过了什么?
谢谢!
答案 0 :(得分:3)
试试这个:
class BusinessType
def revenue(market=nil)
if market.nil?
return self.deals.all.sum(&:price)
else
return self.deals.find(:all, :conditions => ['market_id = ?',market]).sum(&:price)
end
end
end
这应该对你有用,或者至少它是我先做过的一些基本测试。
正如我所收集的那样,这是因为被调用的sum
方法是可枚举的,而不是sum
方法中的ActiveRecord
方法,正如您所期望的那样。
注意:强> 我只是看了一下,并注意到你仍然可以使用比我记录的更小调整的旧代码:
class BusinessType
def revenue(market=nil)
if market.nil?
return self.deals.sum('price')
else
return self.deals.sum('price', :conditions => ['market_id = ?', market])
end
end
end
答案 1 :(得分:1)
试试这个!
class BusinessType
def revenue(market=nil)
if market.nil?
return self.deals.sum(:price)
else
return self.deals.sum(:price,:conditions => ['market_id = ?',market])
end
end
end
您可以参考此链接了解其他功能。 http://en.wikibooks.org/wiki/Ruby_on_Rails/ActiveRecord/Calculations