ActiveRecord是否可以自定义/覆盖属性的名称,使其与数据库中的列名不匹配?
我的具体案例涉及遗留列“修订版”,目前我无法删除。列名与acts_as_audited冲突。在我的迁移完成之前,遗留代码当然是错误的。
我想要的解决方案是覆盖此列的属性名称,并更新调用它的几个区域。因此允许遗留列与acts_as_audited一起生效。
答案 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并使用它,而不需要将属性映射到数据库字段。