2017-02-20 7 views
2

の2つの正確なインスタンスを持つレコードを探す: enter image description here私は複数のバリエーションを持つ製品に関するビジネスロジックを持つアプリケーションを持っている多対多の関係

class Task < ApplicationRecord 
    belongs_to :variant 
end 

class Variant < ApplicationRecord 
    belongs_to :product 

    has_many :variant_option_values 
    has_many :option_values, through: :variant_option_values 
    has_many :prices 
end 

class Product < ApplicationRecord  
    has_many :product_option_types 
    has_many :option_types, through: :product_option_types 
    has_many :variants 
end 

class OptionValue < ApplicationRecord 
    belongs_to :option_type 
end 

class OptionType < ApplicationRecord 
    has_many :product_option_types 
    has_many :products, through: :product_option_types 
    has_many :option_values 
end 

class ProductOptionType < ApplicationRecord 
    belongs_to :product 
    belongs_to :option_type 
end 

class VariantOptionValue < ApplicationRecord 
    belongs_to :variant 
    belongs_to :option_value 
end 

ERDは、このようになります

製品をお持ちの場合product_1OptionValueインスタンスoption_value_1,option_value_2およびoption_value_3のバリアントを見つけるにはどうすればよいですか?バリアントは同時に3つのオプション値をすべて持つ必要があり、3つ以上のオプション値を持つことができます(必ずしもそうである必要はありません)。

答えて

1
option_values = [option_value_1, option_value_2, option_value_3] 

Variant.include(product: [option_types: :option_values]) 
    .where("option_values.id IN (?)", option_values.map(&:id)) 
    .group("products.id") 
    .having("count(*) >= ?", option_values.size) 
+0

このクエリは、指定されたオプション値を持つ製品を検索します。私はそれらのオプション値を持つ特定の製品の変種を探したい。 – pmichna

+0

@pmichna更新された回答を参照してください –

+0

いいですね。ただし、バリアントにはこれらの3つのオプション値のみがあると仮定します。どのようなケースでは、バリアントに3つのオプション値があるだけでなく、他のものもありますか? – pmichna

関連する問題