2016-12-29 10 views
1

考えるといくつかのテーブルを結合します検証一意性は

products prices prices_regions regions

は、私は価格が地域および製品に固有であることを確認したいと思います。 validates_uniqueness_ofを使用してこれを書き込むことは可能ですか、それともカスタム検証が必要ですか?例えば

laptop = Product.create(name: "Laptop") 
tablet = Product.create(name: "Tablet") 
brazil = Region.create(name: "Brazil") 
canada = Region.create(name: "Canada") 
mexico = Region.create(name: "Mexico") 
Price.create(product: laptop, regions: [brazil, mexico]) 
Price.new(product: laptop, regions: [canada]).valid? # true 
Price.new(product: laptop, regions: [canada, brazil]).valid? # false 
Price.new(product: laptop, regions: [canada, mexico]).valid? # false 
Price.new(product: laptop, regions: [brazil, mexico]).valid? # false 
Price.new(product: tablet, regions: [brazil, mexico]).valid? # true 

答えて

0

私はそのカスタムバリデータは、このようなロジックに最適です見つけ、あなたは、必要に応じてこれらのような単純または複雑にすることができ、そして後にロジックを拡張することは容易です。実際には、明示的に質問に答えるために、

# app/models/price.rb 
class Price < ActiveRecord::Base 
    validates :regions, regions: true 
    #... 
end 


# app/validators/regions_validator.rb 
class RegionsValidator < ActiveModel::EachValidator 

    def validate_each(price, _attribute, regions) 
    if price_exists?(price, regions) 
     price.errors.add(:regions, :uniqueness, message: 'must be unique') 
    end 
    end 

    def price_exists?(price, regions) 
    Price.where(product: price.product, regions: regions).present? 
    end 
end 

EDIT

申し訳ありません - あなたは、カスタムバリデータが必要になります。この場合は、次のようになります。 validates_uniqueness_ofは問題のテーブルの列(つまり、Price)のみを検証します。

+0

シンプルな「スコープ内でのユニークな」検証では、これは[Railsのバリデータに組み込まれています](http://guides.rubyonrails.org/active_record_validations.html#uniqueness)です。有効性:価格、一意性:{範囲:地域} '。しかし、この場合、結合テーブルとより複雑なロジックを扱っているので、私はあなたが上で説明したものが最良であることに同意します。 –

関連する問題