我有以下关联:
class Venue < ActiveRecord::Base
has_many :sales
end
class Sale < ActiveRecord::Base
has_many :sale_lines
has_many :beverages, through: :sale_lines
end
class SaleLine < ActiveRecord::Base
belongs_to :sale
belongs_to :beverage
end
class Beverage < ActiveRecord::Base
has_many :sale_lines
has_many :sales, through: :sale_lines
has_many :recipes
has_many :products, through: :recipes
end
class Recipe < ActiveRecord::Base
belongs_to :beverage
belongs_to :product
end
class Product < ActiveRecord::Base
has_many :recipes
has_many :beverages, through: :recipes
end
我不想看到每个场地销售的产品数量,所以基本上我必须将recipe.quantity
乘以特定产品的sale_line.quantity
。
我想致电@venue.calc_sales(product)
获取product
的售出数量。
在班级Venue
内,我试图通过以下方式计算:
class Venue < ActiveRecord::Base
has_many :sales
def calc_sales(product)
sales.joins(:sale_lines, :beverages, :recipes).where('recipes.product_id = ?', product.id).sum('sale_lines.quantity * recipe.quantity')
end
end
但是,我无法以这种方式访问recipes
。
关于如何实现它的任何想法?
答案 0 :(得分:6)
对于联接,您必须使用哈希来加入已连接的表。这很难解释,但这里有一些例子:
Venue.joins(:sales, :beverages)
:这意味着在Venue模型上声明了关系:sales
和:beverages
。
Venue.joins(:sales => :beverages)
:这意味着Venue模型上存在关系:sales
,Sale模型中存在关系:beverages
。
考虑一下:
Venue
has_one :sale
Venue.joins(:sales)
:不会工作,您必须使用与Venue模型和&amp;之间关系完全相同的名称。销售模式。
Venue.joins(:sale)
:这可行,因为您使用了相同的关系名称。
注意:您必须在where子句中使用复数名称:
Venue.joins(:sale).where(:sales => { :id => sale.id })
^^ ^^ # See the plural
在您的情况下,您可以执行以下操作:
sales.joins(:sale_lines => { :beverage => :recipes })
.where(:recipes => { :product_id => product.id })
.sum('sale_lines.quantity * recipes.quantity')