复杂查询...如何在rails中加入许多类?

时间:2013-08-21 14:55:38

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord ruby-on-rails-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

class diagram

我不想看到每个场地销售的产品数量,所以基本上我必须将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

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

1 个答案:

答案 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')