2016-04-28 7 views
-1

Ich habe einen Kühlschrank und ich möchte Produkte in den Kühlschrank legen können. Klingt OK, aber es gibt zwei Regeln:Schienen 4: Validieren Attributeindeutigkeit von hat viele Beziehung

  1. Es gibt nur Kapazität für nur 1 von jedem Produkt im Kühlschrank.
  2. Es gibt einen definierten Satz von Produkten, die ich in den Kühlschrank stellen kann. Die maximale Kapazität im Kühlschrank ist:

    • 1 Käse
    • 1 Ei
    • 1 Milk
    • 1 Butter
    • 1 Paprika
    • 1 Salat

Die Modelle sehen so aus:

class Product < ActiveRecord::Base 
    belongs_to :fridge 
    # Type product 
    enum type: [:cheese, :egg, :milk, :butter, :bell_pepper, :lettuce] 
end 

class Fridge < ActiveRecord::Base 
    has_many :products 
end 

Ist es möglich, im Kühlschrankmodell einen Validator einzurichten, um die definierten Regeln zu erfüllen?

+1

Ja. Lesen Sie den Leitfaden zur benutzerdefinierten Validierung. http://guides.rubyonrails.org/active_record_validations.html#performing-custom-validations – Meier

Antwort

1

Sie können etwas tun:

app/Validatoren/my_validator.rb

class MyValidator < ActiveModel::Validator 
    def validate(record) 
    types = record.fridge.products.select(:type).map &:type 
    type = record.type 
    if types.include? type 
     record.errors[:name] << 'Only 1 capacity for each product' 
    end 
    end 
end 

dann Ihre benutzerdefinierten Validator in Ihrem app/models/product.rb umfassen

class Product < ActiveRecord::Base 
    include ActiveModel::Validations 
    validates_with MyValidator 
    belongs_to :fridge 

end 

Denken Sie auch daran, dies zu Ihrer config/application.rb hinzuzufügen, um den Pfad zu laden:

config.autoload_paths += %W["#{config.root}/app/validators/"] 
Verwandte Themen