2011-08-29 39 views
5

Tôi có một số User trong đó có Widget.Làm cách nào để hủy bỏ mối quan hệ has_one khác khi cập nhật liên kết?

class User 
    has_one :widget, :dependent => :destroy 
end 

class Widget 
    belongs_to :user 
end 

Và khi tôi tạo ra một mới Widget cho một User, tôi muốn tiêu diệt cái cũ gắn liền với User.

Dưới đây là tình hình của tôi:

Tạo một người dùng:

user = User.new 
user.save 
user # => #<User id: 1> 

Tạo tiện ích của người dùng:

widget = Widget.new 
widget.user = user 
widget.save 

Nạp lại và kiểm tra phụ tùng:

user.reload 
user.widget # => #<Widget id: 1, user_id: 1> 

Xây dựng một widget, nhận thấy rằng các widget hiện có bị phá hủy trước kia được lưu:

user.build_widget # => #<Widget id: nil, user_id: 1> 
user.reload 
user.widget # => nil 

phụ tùng tái tạo của người dùng:

user.create_widget # => #<Widget id: 2, user_id: 1> 

Tạo tiện ích khác:

widget = Widget.new :user => user 
widget.save 

Bây giờ, cả hai tồn tại:

Widget.find(2) # => #<Widget id: 2, user_id: 1> 
Widget.find(3) # => #<Widget id: 3, user_id: 1> 

Và người sử dụng là người đầu tiên:

user.reload 
user.widget # => #<Widget id: 2, user_id: 1> 

Có cách nào để làm điều này:

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 

mà không xóa các widget cũ trước khi lưu, hay này:

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 

cuối

mà không giữ hai bản sao xung quanh?

Tôi không muốn muck lên bộ điều khiển của tôi với các giao dịch như

Widget.transaction do 
    old_widget.destroy 
    new_widget.save 
end 

nhưng cho đến nay, điều này có vẻ như là cách duy nhất.

Trả lời

0

Dường như bạn có hai đường dẫn sử dụng nơi người dùng có thể tạo tiện ích. Từ phía người dùng và từ phía tiện ích con.Sẽ tốt hơn nếu bạn rót chúng qua một đoạn mã và đặt một số xác nhận tính duy nhất để đảm bảo không có sự lộn xộn.

how about a find_or_create_by trong user.create_widget để bạn có thể chỉnh sửa tiện ích con hiện tại nếu cần cập nhật hoặc tạo tiện ích con mới.

Các vấn đề liên quan