如何通过字符串参数更新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
相关产品推荐
相关产品推荐

