0

我需要检查表的多个列以查看是否找到匹配项。如果我找到匹配项,我需要使用我的所有表单参数“更新属性”匹配记录......否则我需要使用我的所有表单参数添加一个新记录。

if @somethingtoupdate = Model.where("column1 = ? and column2 = ?", params[:something][:column1], params[:something][:column2])
  if @somethingtoupdate = Model.update_attributes(params[:something])
      redirect_to somewhere_path, :notice => "The existing record was updated"
  else
    render "myformlocation"
  end
else
  @added = Model.new(params[:something])
  if @added.save
    redirect_to somewhere_path, :notice => "The new record was created"  
  else
    render "myformlocation"
  end
end

更新

@somethingtoupdate = Model.where("this_id = ? and that_id = ?", params[:something][:this_id], params[:something][:that_id])
 if ! @somethingtoupdate.empty?
  if @somethingtoupdate.update_attributes(params[:something])
      redirect_to some_path, :notice => "The existing record was updated"
  else
    render "myformlocation"
  end
else
  @added = Model.new(params[:something])
  if @added.save
    redirect_to some_path, :notice => "The new record was created"  
  else
    render "myformlocation"
  end
end

感谢@micahbf,这就是我现在的立场。

但是,当有匹配的记录时,我的“update_attributes”仍然出现错误。

似乎这应该有效....我错过了什么或做错了什么?

4

3 回答 3

1

这是因为如果它没有找到任何东西就不会where返回,它返回一个空数组,它仍然是真实的,所以块被执行。nil

您可以empty?用来检查是否运行该块。

另请注意,如果找到匹配项,则匹配项仍将在数组内返回(即使只有一个匹配项)。因此,您必须执行类似调用first结果的操作以获取第一个返回的模型并对其进行更新。

因此,顶部可能如下所示:

@somethingtoupdate = Model.where("column1 = ? and column2 = ?", params[:something][:column1], params[:something][:column2])
if ! @somethingtoupdate.empty?
  if @somethingtoupdate.first.update_attributes(params[:something])
      redirect_to some_path, :notice => "The existing record was updated"
  else
    render "myformlocation"
  end
else
  // do stuff if the query found no matches
end
于 2013-11-04T05:30:12.687 回答
1

我认为这是查找记录的简短方法,如果找到则更新记录,如果未找到记录则创建它。

@somethingtoupdate = Model.where("column1 = ? and column2 = ?", params[:something][:column1], params[:something][:column2]).first_or_initialize
@somethingtoupdate.update_attributes(params[:something])
于 2013-11-04T06:22:22.557 回答
0

首先,Model.update_attributes(params[:something])它不起作用(至少在 Rails 3.2.12 中)。应该是@somethingtoupdate.update_attributes(params[:something])

此外,还有一种用于这种目的的现有方法:first_or_create。

@somethingtoupdate = Model.where("column1 = ? and column2 = ?", params[:something][:column1], params[:something][:column2]).first_or_create
于 2013-11-04T06:03:53.537 回答