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

如何通过字符串参数更新Rails ActiveRecord对应属性?

如何基于字符串参数简洁更新ActiveRecord属性?

我尝试用.to_sym方法但没成功,不确定这个需求能不能实现。我想基于字符串参数更新ActiveRecord的属性,当前的实现代码如下:

def update_settings(type, value)
  value = ActiveModel::Type::Boolean.new.cast(value)
  case type
  when 'sync_spotify'
    update(sync_spotify: value)
  when 'allowed_use_google_token'
    update(allowed_use_google_token: value)
  when 'allowed_use_spotify_token'
    update(allowed_use_spotify_token: value)
  when 'locale'
    update(locale: value)
  end
end

其中type参数始终和数据库列名一致,请问有没有更简洁的实现方式?


当然可以简化,核心是把字符串类型的type转为符号构造哈希传给update,但必须加属性白名单校验,防止批量赋值漏洞:

优化后的代码

def update_settings(type, value)
  # 定义允许更新的属性白名单,仅开放指定列
  allowed_attributes = %w[sync_spotify allowed_use_google_token allowed_use_spotify_token locale]
  
  # 若type不在白名单内,直接返回不执行更新
  return unless allowed_attributes.include?(type)

  # 仅对非locale属性做布尔类型转换
  value = ActiveModel::Type::Boolean.new.cast(value) unless type == 'locale'
  # 字符串转符号,构造哈希执行更新
  update(type.to_sym => value)
end

关键说明

  • 白名单校验是必须的:避免传入恶意type参数修改其他敏感属性
  • .to_sym转换有效:字符串转符号后可以直接作为ActiveRecord属性的键
  • 针对性类型转换:locale不需要布尔转换,单独跳过避免不必要的处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 02:12:05