ruby-on-rails - multiple - first or create rails
Rails first_or_create método ActiveRecord (3)
De las guías
first_or_create
El método first_or_create
verifica si primero devuelve nil o no. Si devuelve nil, se llama create. Esto es muy poderoso cuando se combina con el método where. Veamos un ejemplo.
Supongamos que quiere encontrar un cliente llamado ''Andy'', y si no hay ninguno, cree uno y además establezca su atributo bloqueado en falso. Puede hacerlo ejecutando:
Client.where(:first_name => ''Andy'').first_or_create(:locked => false)
# => #<Client id: 1, first_name: "Andy", orders_count: 0, locked: false, created_at: "2011-08-30 06:09:27", updated_at: "2011-08-30 06:09:27">
El SQL generado por este método se ve así:
SELECT * FROM clients WHERE (clients.first_name = ''Andy'') LIMIT 1
BEGIN
INSERT INTO clients (created_at, first_name, locked, orders_count, updated_at) VALUES (''2011-08-30 05:22:57'', ''Andy'', 0, NULL, ''2011-08-30 05:22:57'')
COMMIT
first_or_create
devuelve el registro que ya existe o el nuevo registro. En nuestro caso, aún no teníamos un cliente llamado Andy, por lo que el registro se crea y se devuelve.
first_or_create!
¡También puedes usar first_or_create!
para generar una excepción si el nuevo registro no es válido. Las validaciones no están cubiertas en esta guía, pero asumamos por un momento que agrega temporalmente
validates :orders_count, :presence => true
a su modelo de cliente. Si intenta crear un nuevo Cliente sin pasar un orders_count, el registro no será válido y se generará una excepción:
Client.where(:first_name => ''Andy'').first_or_create!(:locked => false)
# => ActiveRecord::RecordInvalid: Validation failed: Orders count can''t be blank
¿Qué first_or_create
el first_or_create
/ first_or_create!
método do en Rails?
Según la documentación , el método " no tiene descripción " ...
Obtiene el primer registro que coincide con lo que ha especificado o crea uno si no hay coincidencias
Si revisas la fuente, verás que son casi idénticos. La única diferencia es que el primero llama al método "crear" y el otro a "crear". Esto significa que el segundo generará una excepción si la creación no tiene éxito.