如何获得家长协会的总和?

时间:2012-08-29 14:02:43

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

在我的Rails 3.2.8应用程序中,我试图计算所有用户产品和税额。它应该得到产品的总数,然后是每种产品的税。

class Product
  attr_accessible :amount, :location_id, :tax_id
  belongs_to :tax
  belongs_to :location
  belongs_to :user
  belongs_to :tax, :class_name => "Tax"

  def self.total
    self.sum(:amount) + self.tax.sum(:amount)
  end
end

Tax.rb

class Tax < ActiveRecord::Base
  attr_accessible :amount, :date, :location_id
  belongs_to :user
  belongs_to :location
  has_many :products
end

所以当我尝试这样的范围时:

<%= number_to_currency(current_user.products.total) %>

这当然给了我一个错误:

undefined method `tax' for #<Class:0x57f5298>

我怎么写这个才能使它有效?

谢谢。

3 个答案:

答案 0 :(得分:3)

tax是Product的实例方法,而不是Product

尝试以下(弱表现):

class Product
  belongs_to :tax

  def self.total
    self.sum(:amount) + all.map(&:tax).map(&:amount).sum
  end
end

答案 1 :(得分:1)

我对ActiveRecord的新查询方法不太满意。我是客人,我有点老式,倾向于更倾向于SQL,但这应该“有效”地得到你想要的东西。

  def self.total
    self.select('sum(products.amount + taxes.amount) AS sum').joins(:tax).try(:sum, 0)
  end

答案 2 :(得分:1)

从这一行

<%= number_to_currency(current_user.products.total) %>

我了解到,对于当前用户,您需要他的产品和税收的总和。 您之前所做的与当前用户无关,而是与整个产品表无关,当然,此表中的某些产品可能与当前用户无关。

所以我想这是怎么回事。

#Instance method for current user
class User < ...
  def product_tax_total
    products.joins(:tax).select('SUM(products.amount + taxes.amount) AS sum').sum
  end
end

并像这样使用它:

<%= number_to_currency(current_user.product_tax_total) %>

更新

您可以使用范围来链接查询:

class Product
  scope :today, lambda { where(:date => Date.today) }
end

然后链接

class User < ...
  def product_tax_total
    products.today.joins(:tax).select('SUM(products.amount + taxes.amount) AS sum').sum
  end
end