2013-05-16 61 views
0

此更新是我在做什麼: -插入或find_or_create_by_id

@userdata =find_or_create_by_id(:id=>params[:id]) 

現在,我怎麼能知道天氣我需要使用 @userdata.save

@userdata.update_attributes params[:user_object] 

而如何通過我的用戶對象的情況下@userdata.save

+0

您可能希望[UPSERT(https://github.com/seamusabshere/upsert) –

回答

3

不知道您是指用戶保存還是update_attributes。 find_or_create_by_id將返回一個用戶對象,根據是否傳遞驗證(如果它不存在),該用戶對象可能會或可能不會被持久化。您可以通過詢問@userdata.persisted?

在任何情況下發現,我建議使用first_or_create:

@userdata = User.where(:id => params[:id]).first_or_create(params[:user_object]) 
if @userdata.persisted? 
    # proceed 
else 
    # errors in params, recover 
end 

UPDATE: Kiddorails是正確的關於上述代碼更新不及時的記錄之前調用,如果它存在。解決方案其實很簡單。對不起,我沒有得到它在第一時間:

@userdata = User.where(:id => params[:id]).first || User.new 
@userdata.update_attributes(params[:user_object]) 

這工作,因爲工作的update_attributes就好了記錄是新的還是堅持。

+0

它有點混亂,你能解釋一下你爲什麼堅持使用? –

+0

而且,錯誤..我不認爲'first_or_create'會'更新'屬性,如果'用戶'與'id'匹配。如果它匹配,它只會返回帶有該id的用戶,而不用'params [:user_object]' – kiddorails

+0

更新。所以,我應該這樣做:if @ userdata.persisted? @ userdata.update_attributes params [:user_object] else #發生了一些錯誤 end –

1

或許,這可以幫助:

@userdata = User.find_or_create_by_id(params[:id]) 
if @userdata.new_record? #=> @userdata is a new record 
    #Add attributes 
    @userdata.save 
else 
    @userdata.update_attributes params[:user_object] 
end 

甚至更​​好,使自己的方法Best way to find_or_create_by_id but update the attributes if the record is found

+0

這是錯誤的。堅持? =>真並不意味着它是一個新的記錄。無論是新記錄還是已經存在,它都會返回true。只有在創建失敗時它纔會返回false。另外,無論哪種情況,都可以使用update_attributes。 – boulder

+0

同意。也許[new_record?](http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-new_record-3F)呢? – kiddorails

+0

如何在@ userdata.save的情況下分配用戶對象? –

1

試試這個。 第一行搜索對象並創建if不存在。

userdata = UserModel.where(:id=>params[:id]).first_or_create(:id=>params[:id]) 
    unless userdata .nil? 
     update_attributes params[:user_object] 
    end