1

是否可以在 ActiveRecord 中自定义/覆盖属性的名称,使其与数据库中的列名不匹配?

我的具体案例涉及一个遗留列“修订”,我目前无法删除。列名与acts_as_audited 冲突。当然,在我的迁移完成之前,我需要的遗留代码会出错。

我想要的解决方案是覆盖该列的属性名称,并更新调用它的几个区域。因此允许遗留列与acts_as_audited 一起存在。

4

2 回答 2

3

我没有使用acts_as_audited,但我假设它的实现是覆盖该列的访问器。在这种情况下,您应该能够执行以下操作:

class ActiveRecord::Base
  def self.name_column(column_name, new_name)
    define_method(new_name) {read_attribute column_name}
    define_method("#{new_name}=") {|value| write_attribute column_name, value}
    define_method("#{new_name}?") {attribute_present? column_name}
  end
end

这些将直接访问名为 in 的列,column_name而无需通过覆盖的访问器。

哦,奖金重复破坏元编程答案:

class ActiveRecord::Base
  def self.name_column(column_name, new_name)
    { ''  => :read_attribute, 
      '=' => :write_attribute, 
      '?' => :attribute_present? }.each do |suffix,method|
      define_method("#{new_name}#{suffix}") {|*args| send method, column_name, *args}
    end
  end
end

只是因为我喜欢展示它是如何做到的。

于 2009-06-26T08:13:55.020 回答
0

创建迁移以将列从修订重命名为您想要的任何内容。然后,您可以声明一个 attr_accessor :revision 并使用它,而无需将属性映射到数据库字段。

于 2009-06-26T06:47:33.087 回答