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