保存多个更新并创建为一个事务 - ruby​​ rails

时间:2014-11-20 03:42:28

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

在我当前的应用程序中,我执行更新PUTS,它更新表中多行的某些属性,并在同一个表中创建新记录。我的控制器代码片段如下所示:

  def update
    params[:p_types].values.each do |p_type_params|
        if p_type_params[:player_id]
            PlayerType.find(p_type_params[:player_id]).update_attributes p_type_params
        else
            @new_player_type = PlayerType.new(p_type_params)
            @new_player_type.save
        end 
    end
    redirect_to action: "index"
  end   

现在,如果流程顺利进行,它会正常工作,它会更新,创建并重定向回索引,从而从更新的表中获取值。但是,我不想要部分更新或行创建。如果由于某些参数约束导致更新失败或创建,则表中没有任何操作,并重定向到之前的索引。我相信解决方案是将所有内容组合为一个事务,检查参数完整性,然后更新表。我无法找到更新或创建的具体示例,我尝试here但不是很清楚。对解决方案的任何帮助都会非常有用!

1 个答案:

答案 0 :(得分:1)

虽然,有点难以理解你的要求是什么,但据我所知,这就是你想要的,

在Rails 3中 - PlayerType.find_or_initialize_by(id: p_type_params[:player_id])

在rails 4中 - PlayerType.where(id: p_type_params[:player_id]).first_or_initialize

上述代码将在表格中找到或初始化新记录,

注意:您也可以使用find_or_create_by但这会创建对象而不是初始化它。希望有所帮助