2011-08-23 10 views
7

¿Es posible omitir las validaciones con un método dinámico de búsqueda/creación por?Cómo omitir validaciones con find_or_create_by_?

Por ejemplo con regularidad sin que yo puedo hacer algo como:

p = Post.new 
p.title = nil 
p.body = nil 
p.save(:validate => false) 

encantaría hacer lo mismo con find_or_create_by_title.

Respuesta

13

Parece imposible con el code in Rails right now, sin embargo, es posible que tenga más suerte siendo un poco más detallado en la forma de escribir el código. Puede usar find_or_initialize_by_ que crea un objeto nuevo pero no lo guarda. A continuación, puede llamar a guardar junto con sus opciones de personalización, también en el documentation tienen una manifestación ordenada que es difícil de encontrar así que incluiremos a continuación:

# No 'Winter' tag exists 
winter = Tag.find_or_initialize_by_name("Winter") 
winter.new_record? # true 

Buena suerte y que me haga saber si necesita más punteros en la dirección correcta.

+0

Muchas gracias. ¡Así es como me fui! Le agradezco que se tome el tiempo de responder. –

1

En algunos casos, find_or_initialize_by_ no será útil y debe omitir las validaciones con find_or_create_by.

Para ello, puede utilizar debajo de flujo alternativo y el método de ROR:

  • actualización de su modelo así:

poste de la clase < ActiveRecord :: Base

attr_accessor: skip_validation
belongs_to: usuario
validates_presence_of: title, a menos que:: skip_validation

final

  • Se puede utilizar ahora como esto:
    Post.where(user_id: self.id).first_or_create!(skip_validation: true)

he utilizado en lugar de first_or_createfind_or_create_by aquí. Puede pasar más nombres y valores de columna con esto, y su validación no se trabajará con esto.

  • Puede continuar sin ninguna modificación por fuertes extremo parámetros y no hay necesidad de permitir este 'skip_validation' por lo que trabajará con validaciones, mientras que la adición de entradas.

  • Usando esto, puede usarlo con y sin validaciones pasando un parámetro.

Cuestiones relacionadas