代码之家  ›  专栏  ›  技术社区  ›  catalpa

Rails中的自定义命名属性

  •  1
  • catalpa  · 技术社区  · 16 年前

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

    我的具体案例涉及一个传统的专栏,“修订版”,我现在不能删除。列名称与“已审核”的行为冲突。当然,在迁移完成之前,哪些代码会出错。

    我想要的解决方案是重写这个列的属性名,并更新调用它的几个区域。因此,允许遗留列与经审计的行为共存。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Chuck    16 年前

    我还没用过 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
    

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

        2
  •  0
  •   Simone Carletti    16 年前

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

    推荐文章