2016-04-24 3 views
3

私はバリアントの価格がで、比較価格が未満のすべてのバリアントをフィルタリングするためにActiveRecordクエリを作成しようとしています。ここに私のバリエーションモデルがあります:関連するテーブルの計算でどのようにフィルタリングするのですか?

class Variant < ApplicationRecord 

    has_and_belongs_to_many :comparisons, 
    class_name: "Variant", 
    foreign_key: "competitor_variant_id", 
    association_foreign_key: "account_variant_id", 
    join_table: "comparisons" 

    belongs_to :parent, polymorphic: true 

end 

は、ここで私はこれまで持っているものです:

joins(:comparisons).where('variants.price < comparisons_variants.min(:price)').distinct 

答えて

1

私は完全にあなたが持っているものを理解していないが、バリアントは、他の変異体と比較されて、正しいですか? その場合、私は比較テーブルが次のようなものだと仮定します:
(variant_id, comparison_id)ここで、両方ともVariant値のIDです。


比較表に結合した後、値がより小さい比較値が残っていて、そのような比較の数が0の場合は、最も低い値を持つ必要があります価格。

scope :with_lowest_price, ->{ 
    joins("left join comparisons on comparisons.variant_id = variants.id left join variants as compared on comparisons.comparison_id = compared.id and variants.price >= compared.price") 
     .group("variants.id") 
     .having("count(compared.id)= 0") 
    } 
関連する問題