Vedo uno strano errore da quando ho spostato da Rails 3.0.11 a 3.1.3. Ecco un codice autonomo per riprodurre l'errore:find_or_initialize_by su has_many associazione causa errore duplicato
require 'active_record'
ActiveRecord::Base.establish_connection(
:adapter => 'mysql2',
:username => 'root',
:database => "some_development"
)
class User < ActiveRecord::Base
has_many :favorites
end
class Favorite < ActiveRecord::Base
belongs_to :user
end
u = User.create
# f = u.favorites.find_or_create_by_site_id(123) #=> pass
f = u.favorites.find_or_initialize_by_site_id(123) #=> fail
f.some_attr = 'foo'
f.save!
u.name = 'bar'
u.save! # ActiveRecord::RecordNotUnique will be thrown here!
finirà ActiveRecord::RecordNotUnique
tentativo di INSERT
lo stesso record alla tabella favorites
. (Si noti che con questo esempio, la coppia (user_id, site_id) deve essere univoca nei preferiti)
È interessante notare che se utilizzo find_or_create
anziché find_or_initialize
non vengono generate eccezioni.
Nella traccia dello stack che ho notato autosave_association
viene chiamato, non so perché, ma in realtà, invece di has_many :favorites, :autosave => false
has_many :favorites
rimuove l'errore, anche. Come non mi è mai importato di autosave
, non sono nemmeno sicuro che se :autosave => false
sia una buona idea o meno.
Cosa sto sbagliando o è un bug di Rails? Qualcuno può darmi un puntatore da guardare?
Fa il modello d'uso hanno una convalida per unicità di un campo? Inoltre, qual è la riga commentata con '# => pass' accanto ad essa? Stai cercando di creare due versioni del preferito contemporaneamente o qualcosa del genere? – Batkins
Sì, il modello Utente ha un sacco di convalide inclusa l'unicità, anche se non sono sicuro di come si rapporta. Se commentate la riga di find_or_create invece di find_or_initialize, dovrebbe passare senza errori, come descritto nella mia domanda. – kenn
Puoi provare questo: invece di 'u.save!', Fai 'u.save' e poi' puts u.errors' o 'p u.errors'. Quali sono gli errori. Ho la sensazione che questo è un problema in cui si sta creando un utente che non passa una delle convalide per l'unicità (dal momento che si sta utilizzando un generico 'User.create' senza che vengano immessi attributi). – Batkins