4

我有以下关联:

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以这种方式访问​​。

关于如何实现它的任何想法?

4

1 回答 1

6

对于连接,您必须使用哈希来连接已连接的表。这很难解释,但这里有一些例子:

  • Venue.joins(:sales, :beverages): 这意味着关系:sales:beverages在 Venue 模型上声明。

  • Venue.joins(:sales => :beverages):这意味着关系:sales存在于 Venue 模型上,而关系:beverages存在于 Sale 模型上。


考虑一下:

Venue
  has_one :sale
  • Venue.joins(:sales): 这不行,你必须使用与 Venue 模型和 Sale 模型之间的关系完全相同的名称。

  • 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')
于 2013-08-21T15:23:48.843 回答