3

我有以下的关联:复杂的查询...如何加入许多类在轨道?

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

我wan't看到各场馆销售的产品数量,所以基本上我也由一个特定产品的sale_line.quantity乘以recipe.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

尝试使用'sales.joins(:sales => {:beverages =>:recipes})' – MrYoshiji

+0

@MrYoshiji'sales.joins(:sale_lines => {:beverage =>:recipes})'诀窍。我并不是很懂复数的规则,但它是以这种方式工作的。只是把你的评论作为答案,我会接受它;)谢谢 – gabrielhilal

回答

6

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

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

  • Venue.joins(:sales => :beverages):这意味着关系:sales存在于Venue模型中,并且销售模型上存在关系:beverages


考虑一下:

Venue 
    has_one :sale 
  • Venue.joins(:sales):这不会工作,你必须使用相同的名称作为场馆模型&销售模型之间的关系。

  • 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')