此更新是我在做什麼: -插入或find_or_create_by_id
@userdata =find_or_create_by_id(:id=>params[:id])
現在,我怎麼能知道天氣我需要使用 @userdata.save
或
@userdata.update_attributes params[:user_object]
而如何通過我的用戶對象的情況下@userdata.save
此更新是我在做什麼: -插入或find_or_create_by_id
@userdata =find_or_create_by_id(:id=>params[:id])
現在,我怎麼能知道天氣我需要使用 @userdata.save
或
@userdata.update_attributes params[:user_object]
而如何通過我的用戶對象的情況下@userdata.save
不知道您是指用戶保存還是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就好了記錄是新的還是堅持。
它有點混亂,你能解釋一下你爲什麼堅持使用? –
而且,錯誤..我不認爲'first_or_create'會'更新'屬性,如果'用戶'與'id'匹配。如果它匹配,它只會返回帶有該id的用戶,而不用'params [:user_object]' – kiddorails
更新。所以,我應該這樣做:if @ userdata.persisted? @ userdata.update_attributes params [:user_object] else #發生了一些錯誤 end –
或許,這可以幫助:
@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
這是錯誤的。堅持? =>真並不意味着它是一個新的記錄。無論是新記錄還是已經存在,它都會返回true。只有在創建失敗時它纔會返回false。另外,無論哪種情況,都可以使用update_attributes。 – boulder
同意。也許[new_record?](http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-new_record-3F)呢? – kiddorails
如何在@ userdata.save的情況下分配用戶對象? –
試試這個。 第一行搜索對象並創建if不存在。
userdata = UserModel.where(:id=>params[:id]).first_or_create(:id=>params[:id])
unless userdata .nil?
update_attributes params[:user_object]
end
您可能希望[UPSERT(https://github.com/seamusabshere/upsert) –