You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails中使用find_or_initialize_by后如何合并剩余参数无需循环?

你完全可以用Rails原生提供的assign_attributes批量赋值方法实现,这是符合Rails规范的标准写法,不需要手动遍历参数逐个赋值。

实现代码

def create
  # 提取查询条件字段
  query_attrs = re_evaluation_params.slice(:program_id, :check_in_id)
  re_evaluation = @client.re_evaluations.find_or_initialize_by(query_attrs)

  # 批量赋值所有参数(已存在的查询字段重复赋值也不会产生副作用)
  re_evaluation.assign_attributes(re_evaluation_params)

  if re_evaluation.save
    render json: re_evaluation, status: :created
  else
    render json: re_evaluation.errors.full_messages, status: :unprocessable_entity
  end
end

补充说明

  • 如果你希望减少冗余赋值,也可以把用于查询的字段排除:re_evaluation.assign_attributes(re_evaluation_params.except(:program_id, :check_in_id)),两种写法效果完全一致。
  • 请确保re_evaluation_params已经做了强参数校验,仅开放允许用户修改的字段,避免批量赋值安全漏洞。
  • 这种写法会正常触发模型的验证、回调逻辑,如果不需要走模型层逻辑仅要操作数据库,可以用Rails提供的upsert系列方法,性能更高。

内容的提问来源于stack exchange,提问作者Jeremy Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:57:06