2010-11-03 67 views
1

我在设置一些模型方法时遇到了RoR中的一些问题。我试图在一个模型上构建一个方法,其中一个参数被提供一个默认值(nil)。理想的是,如果将值传递给方法,它将执行除默认行为之外的其他操作。下面是设置:方法忽略Ruby on Rails中的参数值,使用默认值代替

我目前有四种模式:市场,交易,商户和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) 

还与没有运气。

我错过了什么?

谢谢!

回答

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方法被调用的是enumerable,而不是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 
相关问题