2011-08-29 8 views
5

मेरे पास 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 

लेकिन अब तक, इस एक ही तरीका है की तरह लगता है जैसे लेनदेन के साथ मेरी नियंत्रकों गोबर के लिये नहीं करना चाहती।

उत्तर

0

ऐसा लगता है कि आपके पास दो उपयोग पथ हैं जहां उपयोगकर्ता विजेट बना सकता है। उपयोगकर्ता पक्ष से और विजेट पक्ष से।यह बेहतर होगा अगर आपने कोड के एक टुकड़े के माध्यम से उन्हें फनल किया, और बीमा के लिए कुछ विशिष्टता मान्यताओं को रखा, कोई पर्ची अप नहीं है।

user.create_widget में find_or_create_by के बारे में कैसे करें ताकि आप मौजूदा विजेट को संपादित कर सकें यदि इसे अपडेट करने की आवश्यकता है या आप एक नया बनाते हैं।

संबंधित मुद्दे