如何更新/创建多个记录而不通过另一个模型?

时间:2013-05-22 01:58:45

标签: ruby-on-rails

我有练习,log_entries和用户。

现在我可以浏览一个练习,我看到一个“日志条目”列表,每个条目都包含“reps”和“weight”的数据。

在我的控制器中,我通过点击log_entries来更新exercises_controller,因此它允许我进行批量更新并使用accepts_nested_attributes_for.进行保存但是我觉得这里出现了错误。特别是当我必须将user_id与每个log_entry相关联时。

有没有办法可以处理这个问题,所以我可以用干净的方式更新多条记录,只使用log_entries控制器?通过练习更新log_entries对我来说没有逻辑意义,但也许我的语义雷达已关闭。

这是困扰我的代码:

exercises_controller.rb

  def update
    @exercise = Exercise.find(params[:id])

    recording_user_id = current_user.id
    recording_user_id = params[:user_id] if (params[:user_id].present? && User.find_by_id(params[:user_id]).is_a_client_of?(current_user))

    # associate the log_entries with either current user or client you're recording for.
    if params[:exercise].present? && params[:exercise][:log_entries_attributes].present?
      params[:exercise][:log_entries_attributes].each do |value|
        value[1].merge!(:user_id => recording_user_id)
      end
    end


    respond_to do |format|
      if @exercise.update_attributes(params[:exercise])
        format.html { redirect_to_back_or_default @exercise, notice: "Exercise was successfully updated." }
        format.json { head :ok }
      else
        format.html { render action: "edit" }
        format.json { render json: @exercise.errors, status: :unprocessable_entity }
      end
    end
  end

我如何以更干净的方式处理这个问题?

1 个答案:

答案 0 :(得分:2)

如果你改变了,你可以使这更简单:

if @exercise.update_attributes(params[:exercise])
 ...

为:

@exercise.assign_attributes(params[:exercise])
@exercise.record_log_entries_as(recording_user_id)
if @exercise.save
  ...

并在您的运动模型中:

def record_log_entries_as(user_id)
  log_entries.each{|entry| entry.user_id = user_id if entry.changed? || entry.new_record? }
end

这样,您可以更加可测试的方式更新集合,而无需修改params散列。