使用find_or_create_by id插入或更新

时间:2013-05-16 12:15:48

标签: ruby-on-rails ruby-on-rails-3

这就是我正在做的事情: -

@userdata =find_or_create_by_id(:id=>params[:id])

现在我怎么知道我需要使用的天气 @userdata.save

@userdata.update_attributes params[:user_object]

如果@userdata.save

,如何传递我的用户对象

3 个答案:

答案 0 :(得分:3)

不确定用户是使用save还是update_attributes是什么意思。 find_or_create_by_id将返回一个用户对象,可能会也可能不会持久化,具体取决于是否已通过验证(如果已经存在验证)。您可以通过询问@userdata.persisted?

找到答案

无论如何,我建议使用first_or_create:

@userdata = User.where(:id => params[:id]).first_or_create(params[:user_object])
if @userdata.persisted? 
  # proceed
else
  # errors in params, recover
end

更新: Kiddorails对于上述代码是正确的,如果它在通话之前存在,则不会更新记录。解决方案实际上非常简单。对不起我第一次没弄错:

@userdata = User.where(:id => params[:id]).first || User.new
@userdata.update_attributes(params[:user_object])

这是有效的,因为无论记录是新记录还是持久记录,update_attributes都可以正常工作。

答案 1 :(得分:1)

也许,这可以提供帮助:

@userdata = User.find_or_create_by_id(params[:id])
if @userdata.new_record? #=> @userdata is a new record
  #Add attributes
  @userdata.save
else
  @userdata.update_attributes params[:user_object]
end

甚至更好,将您自己的方法设为Best way to find_or_create_by_id but update the attributes if the record is found

答案 2 :(得分:1)

试试这个。 第一行搜索对象和create if不存在。

   userdata = UserModel.where(:id=>params[:id]).first_or_create(:id=>params[:id])
    unless userdata .nil?
      update_attributes params[:user_object]
    end