2015-09-09 1 views
0

J'ai une validation personnalisée qui est répétée plusieurs modèles. Y a-t-il un moyen de le refactoriser et de le rendre sec?Refonte de la validation personnalisée répétée dans Rails

class Channel < ActiveRecord::Base 

    belongs_to :bmc 
    has_and_belongs_to_many :customer_segments 

    validates :name, presence: true 
    validate :require_at_least_one_customer_segment 

    private 

    def require_at_least_one_customer_segment 
    if customer_segments.count == 0 
     errors.add_to_base "Please select at least one customer segment" 
    end 
    end 

end 



class CostStructure < ActiveRecord::Base 

    belongs_to :bmc 
    has_and_belongs_to_many :customer_segments 

    validates :name, presence: true 
    validate :require_at_least_one_customer_segment 

    private 

    def require_at_least_one_customer_segment 
    if customer_segments.count == 0 
     errors.add_to_base "Please select at least one customer segment" 
    end 
    end 
end 

class CustomerSegment < ActiveRecord::Base 
    has_and_belongs_to_many :channels 
    has_and_belongs_to_many :cost_structures 
end 

Tout lien de référence aussi très apprécié.Merci !!

Répondre

1

Essayez d'utiliser des préoccupations:

app/modèles/préoccupations/shared_validations.rb

module SharedValidations 
    extend ActiveSupport::Concern 
    include ActiveModel::Validations 

    included do 
    belongs_to :bmc 
    has_and_belongs_to_many :customer_segments 

    validates :name, presence: true 
    validate :require_at_least_one_customer_segment 
    end 
end 

puis dans vos classes:

class CostStructure < ActiveRecord::Base 
    include Validateable 
end 
0

Vous pouvez créer facilement votre propre classe de validateur personnalisé en héritant de ActiveModel::Validator. Regardez ici pour quelques exemples simples: http://api.rubyonrails.org/classes/ActiveModel/Validator.html

+0

I J'ai eu cette idée mais customer_segment_id n'est pas un champ de mon modèle. Donc je n'étais pas sûr que cela fonctionne ou pas. Est-ce que cela va? –