2011-04-16 16 views
89

Tengo un modelo A que tiene una asociación "has_many" con otro modelo B. Tengo un requisito empresarial de que una inserción en A requiera al menos 1 registro asociado a B. ¿Hay algún método al que pueda llamar para asegurarme de que esto sea? cierto o debo escribir una validación personalizada?Rieles: ¿Validar la presencia de la asociación?

Respuesta

140

Puede utilizar validates_presence_ofhttp://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_presence_of

class A < ActiveRecord::Base 
    has_many :bs 
    validates_presence_of :bs 
end 

o simplemente validates http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates

class A < ActiveRecord::Base 
    has_many :bs 
    validates :bs, :presence => true 
end 

Pero hay un error con él si va a utilizar accepts_nested_attributes_for con :allow_destroy => true: Nested models and parent validation. En este tema puedes encontrar una solución.

+3

'has_many: bs' lulz – Archonic

6

Puede validar asociaciones con validates_existence_of (que es un plug-in):

fragmento de ejemplo de this blog entry:

class Tagging < ActiveRecord::Base 
    belongs_to :tag 
    belongs_to :taggable, :polymorphic => true 
    validates_existence_of :tag, :taggable 

    belongs_to :user 
    validates_existence_of :user, :allow_nil => true 
end 

Como alternativa, puede utilizar validates_associated. Como Faisal notes in the comments debajo de la respuesta, validates_associated comprueba si el objeto asociado es válido ejecutando las validaciones de clase asociadas. Hace no verifica la presencia. También es importante tener en cuenta que una asociación nula se considera válida.

14

-------- ------------ Rails 4

simple validatespresence trabajó para mí

class Profile < ActiveRecord::Base 
    belongs_to :user 

    validates :user, presence: true 
end 

class User < ActiveRecord::Base 
    has_one :profile 
end 

De esta manera, ahora se producirá un error Profile.create . Tengo que usar user.create_profile o asociar un usuario antes de guardar un profile.

0

Si desea asegurarse de que la asociación es a la vez presente y garantiza que sea válida, también es necesario utilizar

class Transaction < ActiveRecord::Base 
    belongs_to :bank 

    validates_associated :bank 
    validates :bank, presence: true 
end 
Cuestiones relacionadas