我試圖更新模型的值當且僅當模型存在。如果沒有,我什麼也不做。只搜索似乎返回更新或創建問題/答案,但我不想創建。更新如果存在,否則什麼都不做?
我知道我可以用一個簡單的做到這一點:
found = Model.find_by_id(id)
if found
update stuff
end
不過,我覺得有一種方法在一個調用做到這一點,而無需給予任何臨時局部值,或者,如果這樣做的。
如果不存在噪音錯誤,我會如何寫一個軌道電話來更新記錄?
最新的Rails 3.x的
我試圖更新模型的值當且僅當模型存在。如果沒有,我什麼也不做。只搜索似乎返回更新或創建問題/答案,但我不想創建。更新如果存在,否則什麼都不做?
我知道我可以用一個簡單的做到這一點:
found = Model.find_by_id(id)
if found
update stuff
end
不過,我覺得有一種方法在一個調用做到這一點,而無需給予任何臨時局部值,或者,如果這樣做的。
如果不存在噪音錯誤,我會如何寫一個軌道電話來更新記錄?
最新的Rails 3.x的
您可以在find_by_id
或where
結果調用之前的update_attributes使用的Rails try方法。
try
將默默返回nil
而不會引發異常,如果記錄不存在。如果記錄存在,它將更新它。
found = Model.find_by_id(id).try(:update_attributes, {key: value})
假設您的模型被稱爲 '事件',你按ID搜索,你可以這樣做:
e = Event.where(:id => id)
if !e.empty?
e.first.value = new_value
e.first.save!
end
對不起,我應該澄清一下:我想知道如果有是一個rails命令la update_attributes_if_exists。 – 2013-03-20 21:13:46
您可以new_record使用first_or_initialize結合起來呢?如下:
client = Client.where(first_name: 'Nick').first_or_initialize(locked: false)
client.save unless client.new_record?
我*不*要創建,如果它不存在。 – 2013-03-20 21:36:44
這正是'除非new_record?'做的 – sailor 2013-03-21 09:33:38
在Rails 4,這可能是我發現最簡單的辦法:
# POST /users
# POST /users.json
def create
@user = User.find_or_initialize_by(fbid: user_params[:fbid])
@user.assign_attributes(user_params)
respond_to do |format|
if @user.save
format.html { redirect_to @user, notice: 'User was successfully created.' }
format.json { render action: 'show', status: :created, location: @user }
else
format.html { render action: 'new' }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
如果存在與FBID用戶,那麼該記錄將被更新;否則,將創建一個新的。您可以更新記錄以匹配您希望保持唯一的任何列。大概索引列將有助於搜索&檢索等
希望這有助於!
當你說iff模型存在時,你的意思是你想要確定應用程序是否定義了一個模型,或者如果你已經有一些數據在數據庫中的特定數據了? – 2013-03-20 21:11:43
如果我已經在數據庫中有一些特定的數據。 – 2013-03-20 21:14:09
例如:如果客戶訪問了幫助頁面,我記錄了customer_help_visits。當客戶訪問* main *頁面時,他們的customer_help_visits更新last_browsed。並非所有客戶都有customer_help_visits。 這不是我的實際結構,我意識到這個架構看起來有多愚蠢 - 這正是我能想到的一個例子,而沒有具體談論我的實際代碼:] – 2013-03-20 21:16:35