Rails ActiveRecord:自动别名/追加后缀?

时间:2009-02-04 01:24:28

标签: ruby-on-rails ruby activerecord attributes

我有一个遗留数据库,里面有一堆白痴命名的列,如:

some_field_c
some_other_field_c
a_third_field_c

我非常想制作一个Rails ActiveRecord子类,它自动将这些属性别名化为名称减去下划线和“c”。但是,当我尝试时:

attributes.each_key do | key |
  name = key
  alias_attribute key.to_sym, key[0, (key.length -2)].to_sym if key =~ /_c$/
end

在我的类定义中,我得到了一个“未定义的局部变量或方法`attributes'”错误。我也试过覆盖这些方法:

method_missing
respond_to?

但我也一直在错误地使用该路线。

所以我的问题(实际上是问题)是:

  1. 我正在努力做什么?
  2. 如果是这样,最好的方法是什么(缺少迭代别名或覆盖方法)?
  3. 如果不是太麻烦,那么如何做#2的非常简短的代码示例将是非常棒的。
  4. 预先感谢这篇文章收到的任何答案。

3 个答案:

答案 0 :(得分:2)

您的问题可能是attributes是一个实例方法,而您在类的上下文中执行此操作。最接近您想要的类方法是column_names

答案 1 :(得分:1)

你可以做点什么:

methods.each do |method|
  if method.ends_with("_c") then
    self.send(:defind_method,method.slice(0,-2)){self.send(method)}
  end
end

答案 2 :(得分:1)

嗯......我把这个小小的解决方案弄得一团糟,我认为这个解决方案非常优雅......

不确定这是否可行,但我将method_missing别名仍然允许active_record执行此操作:

module ShittyDatabaseMethods
  alias :old_method_missing :method_missing

  def method_missing(method)
    if methods.include?("#{method}_c")
      send("#{method}_c".to_sym)
    else
      old_method_missing(method)
    end
  end

end

class Test
  attr_accessor :test_c
  include ShittyDatabaseMethods
end

您可能无法将您的模块命名为“ShittyDatabaseMethods”,但您明白了这一点;)一旦您定义了该模块并将其填充到lib中,您只需要包含此模块即可:D

很想知道这是否适合你:)