2011-08-29 11 views
5

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.

risposta

0

Sembra che ci siano due percorsi di utilizzo in cui un utente può creare widget. Dal lato utente e dal lato widget.Sarebbe meglio se tu li incanalassi attraverso un pezzo di codice e mettessi delle convalide di unicità per assicurarti che non ci siano flessioni.

come su un find_or_create_by in user.create_widget in modo da poter modificare il widget esistente se è necessario aggiornarlo o crearne uno nuovo.

Problemi correlati