Ich habe ein interessantes Problem. Ich benutze Ruby 1.9.2 und Rails 3.1.3.Schienen schieben in Array speichert Objekt
Ich habe 2 Modelle, zur Vereinfachung sagen wir Kunden und speichert. Stores haben viele Kunden, und ein Kunde gehört zu einem Geschäft. Ich versuche, alle Kunden für ein Geschäft zu sammeln, und erstellen Sie einen Platz für ein paar mehr, die ich später mit Werten füllen kann. Stattdessen wird customer.save aufgerufen, wenn ich es nicht erwarte.
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
Aus irgendeinem Grund, wenn der Kunde in das Array geschoben wird, wird customer.save aufgerufen. Es passiert nicht, wenn Sie auf ein Array drücken, ist ein einfaches Array und keine Beziehung.
Ich habe einen Workaround gefunden, aber ich frage mich immer noch, warum das passiert. Die Abhilfe:
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
Für diejenigen, die nach einer Lösung und nicht nach dem Warum suchen: Verwenden Sie '' 'build''' für die Sammlung, um ein Modell zu erstellen, ohne es zu speichern: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods .html # module-ActiveRecord :: Assoziationen :: ClassMethods-label-Collections – blu
Ich hatte das gegenteilige Problem. Wenn Sie 'build' in den Modellspezifikationen verwenden, funktioniert das Hinzufügen von Elementen zu einer Sammlung mit << nicht. Die Antworten auf diese Frage erklären warum nicht. – CJBrew