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
相关产品推荐
相关产品推荐

