Tengo un problema interesante. Estoy usando Ruby 1.9.2 y Rails 3.1.3.Rails push into array guarda el objeto
Tengo 2 modelos, para simplificación, digamos clientes y tiendas. Las tiendas tienen muchos clientes y un cliente pertenece a una tienda. Estoy tratando de reunir a todos los clientes de una tienda y crear un lugar para algunos más que pueda completar con valores posteriores. En cambio, se llama a customer.save cuando no lo espero.
store = Store.find(1)
customers_array = store.customers
random_array = Array.new
customers_count = customers_array.count + 1
(customers_count..2).each do |i|
customer = Customer.new
c.id = "#{i}000000000000"
random_array << customer # this line doesn't call customer.save
customers_array << customer # this line calls customer.save when store has customers
end
Por alguna razón, cuando se introduce al cliente en la matriz, se llama a customer.save. No sucede si presionas una matriz es una matriz simple y no una relación.
Encontré una solución, pero todavía me pregunto por qué sucede eso. La solución:
store = Store.find(1)
initial_customers_array = store.customers
additional_customers_array = Array.new
customers_count = initial_customers_array.count + 1
(customers_count..2).each do |i|
customer = Customer.new
c.id = "#{i}000000000000"
additional_customers_array << customer
end
customers_array = initial_customers_array + additional_customers_array
Para aquellos que buscan una solución y no el por qué: use '' 'build''' en la colección para crear un modelo sin guardarlo: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods .html # module-ActiveRecord :: Associations :: ClassMethods-label-Collections – blu
Tuve el problema opuesto. Usar 'build' en las especificaciones del modelo, luego agregar elementos a una colección usando << no funcionó. Las respuestas a esta pregunta explican por qué no. – CJBrew