Ruby on rails 如何在不经过其他模型的情况下更新/创建多个记录?
我有练习、日志和用户 现在我可以浏览一个练习,看到一个“日志条目”列表,每个条目都有“重复次数”和“权重”的数据 在我的控制器中,我通过点击Ruby on rails 如何在不经过其他模型的情况下更新/创建多个记录?,ruby-on-rails,Ruby On Rails,我有练习、日志和用户 现在我可以浏览一个练习,看到一个“日志条目”列表,每个条目都有“重复次数”和“权重”的数据 在我的控制器中,我通过点击exercises\u controller来更新log\u条目,因此它允许我使用接受嵌套的属性进行批量更新和保存。但是我觉得这里有问题。尤其是当我必须将用户id与每个日志条目关联时 是否有一种方法可以处理此问题,以便以干净的方式更新多个记录,并且仅使用log_entries控制器?通过练习来更新日志条目对我来说没有逻辑意义,但可能我的语义雷达已经关闭了 下
exercises\u controller
来更新log\u条目,因此它允许我使用接受嵌套的属性进行批量更新和保存。
但是我觉得这里有问题。尤其是当我必须将用户id
与每个日志条目关联时
是否有一种方法可以处理此问题,以便以干净的方式更新多个记录,并且仅使用log_entries控制器?通过练习来更新日志条目对我来说没有逻辑意义,但可能我的语义雷达已经关闭了
下面是困扰我的代码:
练习\u 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
如何以更干净的方式处理此问题?如果您更改以下内容,则可以简化此操作:
if @exercise.update_attributes(params[:exercise])
...
致:
在你的练习模式中:
def record_log_entries_as(user_id)
log_entries.each{|entry| entry.user_id = user_id if entry.changed? || entry.new_record? }
end
通过这种方式,您可以以更易于测试的方式更新集合,而无需修改params散列
def record_log_entries_as(user_id)
log_entries.each{|entry| entry.user_id = user_id if entry.changed? || entry.new_record? }
end