2013-03-20 63 views
3

我試圖更新模型的值當且僅當模型存在。如果沒有,我什麼也不做。只搜索似乎返回更新或創建問題/答案,但我不想創建。更新如果存在,否則什麼都不做?

我知道我可以用一個簡單的做到這一點:

found = Model.find_by_id(id) 
if found 
    update stuff 
end 

不過,我覺得有一種方法在一個調用做到這一點,而無需給予任何臨時局部值,或者,如果這樣做的。

如果不存在噪音錯誤,我會如何寫一個軌道電話來更新記錄?

最新的Rails 3.x的

+2

當你說iff模型存在時,你的意思是你想要確定應用程序是否定義了一個模型,或者如果你已經有一些數據在數據庫中的特定數據了? – 2013-03-20 21:11:43

+0

如果我已經在數據庫中有一些特定的數據。 – 2013-03-20 21:14:09

+0

例如:如果客戶訪問了幫助頁面,我記錄了customer_help_visits。當客戶訪問* main *頁面時,他們的customer_help_visits更新last_browsed。並非所有客戶都有customer_help_visits。 這不是我的實際結構,我意識到這個架構看起來有多愚蠢 - 這正是我能想到的一個例子,而沒有具體談論我的實際代碼:] – 2013-03-20 21:16:35

回答

8

您可以在find_by_idwhere結果調用之前的update_attributes使用的Rails try方法。

try將默默返回nil而不會引發異常,如果記錄不存在。如果記錄存在,它將更新它。

found = Model.find_by_id(id).try(:update_attributes, {key: value}) 
0

假設您的模型被稱爲 '事件',你按ID搜索,你可以這樣做:

e = Event.where(:id => id) 
if !e.empty? 
    e.first.value = new_value 
    e.first.save! 
end 
+0

對不起,我應該澄清一下:我想知道如果有是一個rails命令la update_attributes_if_exists。 – 2013-03-20 21:13:46

1

您可以new_record使用first_or_initialize結合起來呢?如下:

client = Client.where(first_name: 'Nick').first_or_initialize(locked: false) 
client.save unless client.new_record? 
+1

我*不*要創建,如果它不存在。 – 2013-03-20 21:36:44

+0

這正是'除非new_record?'做的 – sailor 2013-03-21 09:33:38

0

在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用戶,那麼該記錄將被更新;否則,將創建一個新的。您可以更新記錄以匹配您希望保持唯一的任何列。大概索引列將有助於搜索&檢索等

希望這有助於!

相關問題