是否可以在 ActiveRecord 中自定义/覆盖属性的名称,使其与数据库中的列名不匹配?
我的具体案例涉及一个遗留列“修订”,我目前无法删除。列名与acts_as_audited 冲突。当然,在我的迁移完成之前,我需要的遗留代码会出错。
我想要的解决方案是覆盖该列的属性名称,并更新调用它的几个区域。因此允许遗留列与acts_as_audited 一起存在。
是否可以在 ActiveRecord 中自定义/覆盖属性的名称,使其与数据库中的列名不匹配?
我的具体案例涉及一个遗留列“修订”,我目前无法删除。列名与acts_as_audited 冲突。当然,在我的迁移完成之前,我需要的遗留代码会出错。
我想要的解决方案是覆盖该列的属性名称,并更新调用它的几个区域。因此允许遗留列与acts_as_audited 一起存在。
我没有使用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
只是因为我喜欢展示它是如何做到的。
创建迁移以将列从修订重命名为您想要的任何内容。然后,您可以声明一个 attr_accessor :revision 并使用它,而无需将属性映射到数据库字段。