2010-10-16 12 views
21

tengo un modelo de lugar y me quieren hacer estorieles encontrar o crear basan en dos campos

Venue.find_or_create_by_ 

pero yo sólo quieren un nuevo lugar a crearse si uno con el mismo nombre y la fecha aún no existir

Por ejemplo

=> Venue(id: integer, location: string, showdate: datetime, created_at: datetime, updated_at: datetime) 

escenario es único y tiene que ser creado si la ubicación y el showdate no están presentes en la db

Respuesta

41

Puede encadenar columnas juntas usando _and_. Esto debería hacer el truco:

Venue.find_or_create_by_location_and_showdate(location, showdate) 
+0

Por Dios, Rails y particularmente Ruby continuamente me sorprende. ¿Cómo sabe lo que significa esa función? ¿Hay algún tipo de capturar toda la función find_or_create_by_ * que la interpreta? – Jordan

+7

En realidad, no lo olvides, acabo de echar un vistazo a la fuente de Rails: Rails usa una función method_missing que hace una expresión regular del método llamado y lo descompone. Es genio Si alguien más está interesado, mira active_record/base.rb en la fuente de Rails. – Jordan

+0

También es aceptable pasarlos como argumentos. Venue.find_or_create_by (: location => location,: showdate => showdate) –

1
my_class = ClassName.find_or_initialize_by_showdate_and_location(showdate,location) 
my_class.update_attributes! 

método find_or_initialize buscar por nombre y ubicación en la base de datos. Si el registro no existe, inicialice el nuevo registro con fecha y ubicación. http://api.rubyonrails.org/classes/ActiveRecord/Base.html Este enlace lo ayudará a encontrar find_or_initialize y find_or_create.

+0

Llamar '.update_attributes!' Sin pasar ningún atributo es bastante inútil. '.save!' sería una opción mucho mejor. Y en este caso, el solicitante ya ha dicho que quiere usar '.find_or_create', por lo que no debería tener que inicializar y guardar el registro en dos pasos separados. – vonconrad

+0

@vonconrad Ya he proporcionado un enlace que da una idea sobre ambos métodos. Cualquier usuario que quiera usarlo. Estaba dando una idea de que ambos métodos están disponibles. –

+1

utilizando find_or_initialize supera el problema de intentar crear un registro cuando hay validaciones que no se cumplen con una creación. p.ej. Migrando datos desde otro sistema. – Gary

7

En los carriles 4 puede hacer:

Venue.find_or_create_by(location: location, showdate: showdate) 

mucho más bonita, si me preguntas!

Cuestiones relacionadas