Rails中的自定义命名属性

时间:2009-06-26 04:26:50

标签: ruby-on-rails activerecord acts-as-audited

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

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

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

2 个答案:

答案 0 :(得分: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

这些将直接访问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

仅仅因为我想展示如何做到这一点。

答案 1 :(得分:0)

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