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.