2009-08-26 17 views
14

Tengo una Categoría y un modelo de Publicación, con cada Publicación perteneciente a una Categoría. Antes de crear o actualizar una publicación, necesito verificar que exista la categoría seleccionada. ¿Cuál es la mejor manera de validar esta información?Rieles: Validación de la existencia de una asociación

Por el momento, estoy haciendo un hallazgo en el controlador para garantizar que exista la categoría. ¿Es posible poner este tipo de validaciones en el modelo?

Respuesta

14

http://blog.hasmanythrough.com/2007/7/14/validate-your-existence

class Post < ActiveRecord::Base 
    belongs_to :category 
    validates_presence_of :category 
end 

-O-

class Post < ActiveRecord::Base 
    belongs_to :category 
    validates :category, presence: => true 
end 

rieles versiones anteriores a la 3.2:

class Post < ActiveRecord::Base 
    belongs_to :category 
    validates_existence_of :category 
end 
+0

Funcionará si la categoría tiene un ámbito de aplicación? Diga que la categoría pertenece a un Blog. El usuario solo debe poder seleccionar categorías pertenecientes al blog. – Homar

+0

@Homar No estoy seguro sobre el alcance, si la asociación belongs_to incluye esta restricción, supongo que funcionaría. –

+0

esto se renombró para validates_presence_of en versiones de carriles más nuevas – Fa11enAngel

5

He puesto esto en mi modelo:

validate :ensure_category_exists 

    def ensure_category_exists 
    errors.add('Category') unless self.blog.categories.find_by_id(self.category_id) 
    end 

Que imprime "Categoría no es válida" si la categoría no existe para el blog padre.

-1

En Rails 3, validates_associated es probablemente lo que estás buscando? http://guides.rubyonrails.org/active_record_validations_callbacks.html#validates_associated

+2

'validates_associated' ejecutará las validaciones en el modelo asociado, y fallará el modelo principal si la asociación no es válida. Entonces validaría la existencia, pero tiene un comportamiento adicional que el OP puede o no querer. – Woahdae

+3

He probado esto y 'validates_associated' no se rompe si el modelo asociado no existe (como era de esperar). Supongo que solo falla si el modelo asociado existe, tiene validaciones y al menos una de ellas falla. – hsribei

+0

Como dijo obvio171, validates_associated NO valida la existencia de la asociación. – hrdwdmrbl

20

En Rails 3.2, validates_existence_of se reemplaza por validates_presence_of.

+4

también es posible 'validates: category,: presence => true' –

1

En mi forma de pensar una mejor opción es esta joya: https://github.com/perfectline/validates_existence

Se valida la existencia de los modelos relacionados en la base de datos. Imagine que tiene un campo desplegable que devuelve algunos datos basura incluso cuando no selecciona nada (etiqueta de campo predeterminada no seleccionada como valor por defecto). La validación de la presencia no funcionará, ya que pasará por los datos existentes. Pero queremos algún tipo de restricción y esta verificación del lado de DB es lo que resuelve el problema.

Cuestiones relacionadas