5

当且仅当模型存在时,我才尝试更新模型的值。如果没有,我什么也不做。搜索似乎只返回更新或创建问题/答案,但我不想创建。

我知道我可以用一个简单的方法做到这一点:

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

但是,我觉得有一种方法可以在一次调用中执行此操作,而无需分配任何临时本地值或执行 if。

如果它不存在,我将如何编写一个 rails 调用来更新没有嘈杂错误的记录?

最新的 Rails 3.x

4

4 回答 4

14

在or的结果上调用 update_attributes 之前,您可以使用Rails 的try方法。find_by_idwhere

trynil如果记录不存在,将静默返回而不引发异常。如果记录存在,它将更新它。

found = Model.find_by_id(id).try(:update_attributes, {key: value})
于 2013-03-21T09:10:43.403 回答
1

您可以将 first_or_initialize 与 new_record 结合使用吗?如下:

client = Client.where(first_name: 'Nick').first_or_initialize(locked: false)
client.save unless client.new_record?
于 2013-03-20T21:16:18.357 回答
0

假设您的模型称为“事件”并且您按 id 搜索,您可以执行以下操作:

e = Event.where(:id => id)
if !e.empty?
  e.first.value = new_value
  e.first.save!
end
于 2013-03-20T21:09:36.807 回答
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 的用户,则更新记录;否则,将创建一个新的。您可以更新记录以匹配您想要保持唯一的任何列。可能索引该列将有助于搜索和检索等。

希望这可以帮助!

于 2014-04-19T01:09:35.030 回答