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:beveragesVenue モデルで宣言されていることを意味します。

  • 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 に答える