代码之家  ›  专栏  ›  技术社区  ›  david.pfx

向Rails模型添加动态属性

  •  0
  • david.pfx  · 技术社区  · 6 年前

    在Rails的早期版本中,可以向模型添加动态属性,而不需要SQL列。下面的代码在4.0之前运行。

    drow = dtab1.drows.create()
    drow.write_attribute('value1', 'xxx')
    drow.write_attribute('value2', 'yyy')
    drow.write_attribute('value3', 'zzz')
    

    但现在在v5中我得到:

    ActiveModel::MissingAttributeError: can't write unknown attribute `value1`
    

    现在有办法吗?

    其他答案建议使用预定义的访问器,或者用“用户变量”散列替换动态字段,但这对我的情况不起作用。它们必须是真正动态的,在运行时创建并作为模型的一部分处理。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Ilya Konyukhov    6 年前

    这个 write_attribute 方法更新基础表中的属性。由于新属性是动态的,并且与模型表中的字段不匹配,所以难怪它不起作用。

    attr_name = 'value1'
    
    # Declaring attr_accessor: attr_name
    drow.instance_eval { class << self; self end }.send(:attr_accessor, attr_name)
    
    drow.send(attr_name + '=', 'xxx')   # setter
    drow.send(attr_name)                # getter
    

    属性将保存到实例变量 @value1 .

    保存动态属性的另一种方法是直接更改该变量,而不声明属性访问器:

    drow.instance_variable_set("@#{attr_name}".to_sym, 'xxx') # setter
    drow.instance_variable_get("@#{attr_name}".to_sym)        # getter