0

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

税.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>

我怎样才能写这个让它工作?

谢谢你。

4

3 回答 3

3

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

尝试以下(性能较弱):

class Product
  belongs_to :tax

  def self.total
    self.sum(:amount) + all.map(&:tax).map(&:amount).sum
  end
end
于 2012-08-29T14:16:05.013 回答
1

我不喜欢 ActiveRecord 的新查询方法。我客人我有点过时并且倾向于更倾向于SQL,但这应该“有效地”得到你想要的。

  def self.total
    self.select('sum(products.amount + taxes.amount) AS sum').joins(:tax).try(:sum, 0)
  end
于 2012-08-31T02:53:19.023 回答
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
于 2012-09-01T20:38:32.213 回答