मेरे पास User
है जिसमें Widget
है।एसोसिएशन अपडेट करते समय मैं दूसरे हैसोन रिलेशनशिप को कैसे नष्ट करूं?
class User
has_one :widget, :dependent => :destroy
end
class Widget
belongs_to :user
end
और जब मैं एक User
के लिए एक नया Widget
बनाने के लिए, मैं User
के साथ जुड़े पुराने एक को नष्ट करना चाहते हैं।
यहाँ मेरी स्थिति है:
user = User.new
user.save
user # => #<User id: 1>
उपयोगकर्ता के विजेट बनाएं:
widget = Widget.new
widget.user = user
widget.save
पुनः लोड और विजेट की जाँच करें:
उपयोगकर्ता बनाना
user.reload user.widget # => #<Widget id: 1, user_id: 1>
एक विजेट का निर्माण, ध्यान दें कि मौजूदा विजेट से पहले अन्य सहेजा जाता है को नष्ट कर दिया जाता है:
user.build_widget # => #<Widget id: nil, user_id: 1>
user.reload
user.widget # => nil
विश्राम उपयोगकर्ता के विजेट:
user.create_widget # => #<Widget id: 2, user_id: 1>
एक और विजेट बनाएं:
widget = Widget.new :user => user
widget.save
अब, दोनों मौजूद हैं:
Widget.find(2) # => #<Widget id: 2, user_id: 1>
Widget.find(3) # => #<Widget id: 3, user_id: 1>
और उपयोगकर्ता का प्रथम है:
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
:
user.reload
user.widget # => #<Widget id: 2, user_id: 1>
वहाँ यह करने के लिए कोई तरीका हैसहेजने से पहले वर्ष विजेट हटाए बिना, या इस:
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
अंत
दो प्रतियां आपके पास रख बिना ?
मैं
Widget.transaction do
old_widget.destroy
new_widget.save
end
लेकिन अब तक, इस एक ही तरीका है की तरह लगता है जैसे लेनदेन के साथ मेरी नियंत्रकों गोबर के लिये नहीं करना चाहती।