0

我有 3 个模型,称为价格、单价和购买。Price 和 UnitPrice 模型有一个名为的属性amount,我试图将其限定并获取两者的总和。我创建了两个范围,一个用于两个模型的总和。另一个范围是获取date两个模型date字段的属性。

我正在尝试这样做:

<%= number_to_currency(current_user.purchases.today.total)

但得到错误:

NoMethodError in pages#home

undefined method `today' for #<ActiveRecord::Relation:0x77f94c0>

我的代码:

class Purchase < ActiveRecord::Base
  belongs_to :user
  belongs_to :price
  belongs_to :unit_price

  def total
    self.price.sum(:amount) + self.unit_price.sum(:amount)
  end

  def today
    self.price.where(:date => Date.today) && self.unit_price.where(:date=> Date.today)
  end
end

class Price < ActiveRecord::Base
  attr_accessible :amount, :date
  belongs_to :user
  has_many :purchases
end

class UnitPrice < ActiveRecord::Base
  attr_accessible :amount, :date
  belongs_to :user
  has_many :purchases
end

我该怎么办?

4

2 回答 2

2

我认为您的问题可能是您使用的是类方法而不是实例方法。在您的 Purchase 类中,删除self.方法定义之前的:

class Purchase < ActiveRecord::Base
  def total
    self.price.sum(:amount) + self.unit_price.sum(:amount)
  end

  def today
    self.price.where(:date => Date.today) && self.unit_price.where(:date=> Date.today)
  end
end
于 2012-08-13T23:13:01.093 回答
1

方法totaltoday在模型对象上定义。当你打电话给 你时,current_user.purchases你关联到一个关系,has_many这意味着最终它是数组。因此,您不能在其上调用 Purchase 方法。你可以这样做:

  class Purchase < ActiveRecord::Base
    # ...
    scope :today, lambda { joins(:unit_price, :price).
                             where(:price => {:date => Date.today}, 
                                   :unit_price => { :date => Date.today }) }
    def total
        self.price.sum(:amount) + self.unit_price.sum(:amount)
    end
  end

然后这样称呼它:

   <%= number_to_currency(current_user.purchases.today.inject{ |sum, p| sum + p.total }) %>

范围可以在关系上调用。

您需要调用注入,因为再次total是购买方法并且关系是数组,因此您需要聚合数组。为了保持代码干净,您可能需要定义一个today_purchases_total方法,User然后您可以像这样调用它:

   <%= number_to_currency(current_user.today_purchases_total) %>

有关这方面的更多信息,您可以参考http://guides.rubyonrails.org/active_record_querying.html#scopes和所有一般的 RoR 指南。

于 2012-08-16T21:10:49.173 回答