Метод, игнорирующий значение параметра в Ruby on Rails, вместо него используется значение по умолчанию - PullRequest
1 голос
/ 03 ноября 2010

У меня возникают некоторые проблемы в RoR с некоторыми модельными методами, которые я устанавливаю. Я пытаюсь построить метод на одной модели с аргументом, который получает значение по умолчанию (ноль). В идеале, если значение передается методу, он будет делать что-то отличное от поведения по умолчанию. Вот настройки:

В настоящее время у меня есть четыре модели: 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 ]

3 голосов
/ 03 ноября 2010

Попробуйте это:

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

Это должно сработать для вас, или, по крайней мере, это сработало для базового тестирования, которое я сделал первым.1006 * вызываемый метод включен для перечисления, а не 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 голос
/ 03 ноября 2010

Попробуйте!

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...