在我的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>
我怎么写这个才能使它有效?
谢谢。
答案 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