方法忽略Ruby on Rails中的参数值,而是使用默认值

时间:2010-11-03 14:52:29

标签: ruby-on-rails ruby methods arguments default-value

我在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)

也没有运气。

我错过了什么?

谢谢!

2 个答案:

答案 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