将活动记录列名称覆盖为大写

时间:2014-09-24 13:12:04

标签: mysql ruby-on-rails activerecord

我试图通过覆盖mysql的活动记录连接适配器来将活动记录列名称设置为大写。但我肯定做错了什么并且出现missing attribute错误。

我必须这样做,因为我们有一个复杂的设置,我们在oracle和MySQL之间切换,两个数据库都使用大写表名和列名。

这就是我尝试的方式,但它似乎无法运作

module ActiveRecord::ConnectionAdapters
    class Column
        def name
            @name.downcase
        end
    end
end

有人可以在这里提出错误。

1 个答案:

答案 0 :(得分:1)

我不会在ActiveRecord类中自行完成它,你可能最终会在自己的rails中打破很多内置函数。

另外你应该明白,在自己的类中调用类的属性会导致无限递归调用并最终出现错误

class Something < ActiveRecord::Base
  def name
    name.downcase # this is bad
  end
end

相反,您应该使用函数read_attribute

class Something < ActiveRecord::Base
  def name
    read_attribute(name).downcase # this will work safely
  end
end

如果你想保持你的代码干净并且不在每个地方重复同样的事情,你可以将它提取到concern并将其包含在你想要使用它的类中。

module DownCaseName
  extend ActiveSupport::Concern
  def name
    read_attribute(name).downcase
  end
end

class Something < ActiveRecord::Base
  incude DownCaseName
end