Rails中无法从Concern设置attr_accessor至模型层级问题求助
问题原因
你遇到的报错是因为:
attr_accessor只会生成strategy_display_name和strategy_display_name=两个实例方法,属于虚拟属性;- 而
obj["strategy_display_name"]这种下标式赋值/访问,是ActiveRecord模型对数据库字段提供的默认支持,虚拟属性不会自动适配这种写法。
解决办法
方法1:直接使用点语法(最简便)
放弃下标式写法,用实例方法直接赋值/访问:
# 赋值 obj.strategy_display_name = "test_display_name" # 取值 obj.strategy_display_name
方法2:让虚拟属性支持下标式访问(保留原有写法)
修改你的StrategyConcern,添加[]=和[]方法,让虚拟属性也能通过Hash风格的语法读写:
module StrategyConcern extend ActiveSupport::Concern included do attr_accessor :strategy_display_name # 处理下标赋值 def []=(key, value) method_name = "#{key}=" if respond_to?(method_name) send(method_name, value) else # 回退到ActiveRecord默认的数据库字段处理逻辑 super end end # 处理下标取值 def [](key) if respond_to?(key) send(key) else super end end end end
修改后,你既可以用obj["strategy_display_name"] = "test_display_name"赋值,也能继续用点语法,同时不影响数据库字段的原有操作。
方法3:用ActiveRecord的属性赋值方法
如果你的模型是ActiveRecord模型,还可以用assign_attributes批量赋值:
obj.assign_attributes(strategy_display_name: "test_display_name")
内容的提问来源于stack exchange,提问作者Ram Hegde
相关产品推荐
相关产品推荐

