update rails multiple first create ruby-on-rails ruby activerecord rails-activerecord

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.