I have a User
che has_one Widget
.Come si distrugge l'altra relazione has_one quando si aggiorna un'associazione?
class User
has_one :widget, :dependent => :destroy
end
class Widget
belongs_to :user
end
E quando creo un nuovo Widget
per un User
, voglio distruggere il vecchio associato alla User
.
Ecco la mia situazione:
creare un utente:
user = User.new
user.save
user # => #<User id: 1>
Creare widget di dell'utente:
widget = Widget.new
widget.user = user
widget.save
Ricarica e controllare il widget:
user.reload
user.widget # => #<Widget id: 1, user_id: 1>
costruire un widget, notare che il widget esistente viene distrutta prima che l'altro è salvato:
user.build_widget # => #<Widget id: nil, user_id: 1>
user.reload
user.widget # => nil
widget di di Ricrea dell'utente:
user.create_widget # => #<Widget id: 2, user_id: 1>
Creare un altro widget:
widget = Widget.new :user => user
widget.save
Ora, entrambi esistono:
Widget.find(2) # => #<Widget id: 2, user_id: 1>
Widget.find(3) # => #<Widget id: 3, user_id: 1>
l'utente e è il primo:
user.reload
user.widget # => #<Widget id: 2, user_id: 1>
Esiste un modo per fare questo:
def create
@widget = current_user.build_widget(params[:widget])
respond_to do |format|
if @widget.save
format.html { redirect_to widget_path, notice: 'Widget was successfully created.' }
format.json { render json: @widget, status: :created, location: @widget }
else
format.html { render action: 'new' }
format.json { render json: @widget.errors, status: :unprocessable_entity }
end
end
end
senza eliminare il vecchio widget di prima di salvare, o questo:
def create
@widget = Widget.new(params[:widget])
@widget.user = current_user
respond_to do |format|
if @widget.save
format.html { redirect_to widget_path, notice: 'Widget was successfully created.' }
format.json { render json: @widget, status: :created, location: @widget }
else
format.html { render action: 'new' }
format.json { render json: @widget.errors, status: :unprocessable_entity }
end
end
fine
senza tenere due copie in tutto?
Non voglio fare muck le mie controllori con le transazioni come
Widget.transaction do
old_widget.destroy
new_widget.save
end
ma finora, questo mi sembra l'unico modo.