当且仅当模型存在时,我才尝试更新模型的值。如果没有,我什么也不做。搜索似乎只返回更新或创建问题/答案,但我不想创建。
我知道我可以用一个简单的方法做到这一点:
found = Model.find_by_id(id)
if found
update stuff
end
但是,我觉得有一种方法可以在一次调用中执行此操作,而无需分配任何临时本地值或执行 if。
如果它不存在,我将如何编写一个 rails 调用来更新没有嘈杂错误的记录?
最新的 Rails 3.x
当且仅当模型存在时,我才尝试更新模型的值。如果没有,我什么也不做。搜索似乎只返回更新或创建问题/答案,但我不想创建。
我知道我可以用一个简单的方法做到这一点:
found = Model.find_by_id(id)
if found
update stuff
end
但是,我觉得有一种方法可以在一次调用中执行此操作,而无需分配任何临时本地值或执行 if。
如果它不存在,我将如何编写一个 rails 调用来更新没有嘈杂错误的记录?
最新的 Rails 3.x
在or的结果上调用 update_attributes 之前,您可以使用Rails 的try方法。find_by_id
where
try
nil
如果记录不存在,将静默返回而不引发异常。如果记录存在,它将更新它。
found = Model.find_by_id(id).try(:update_attributes, {key: value})
您可以将 first_or_initialize 与 new_record 结合使用吗?如下:
client = Client.where(first_name: 'Nick').first_or_initialize(locked: false)
client.save unless client.new_record?
假设您的模型称为“事件”并且您按 id 搜索,您可以执行以下操作:
e = Event.where(:id => id)
if !e.empty?
e.first.value = new_value
e.first.save!
end
在 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 的用户,则更新记录;否则,将创建一个新的。您可以更新记录以匹配您想要保持唯一的任何列。可能索引该列将有助于搜索和检索等。
希望这可以帮助!