English 中文(简体)
Rails ActiveRecord:自动别名/追加后缀?
原标题:
  • 时间:2009-02-04 01:24:28
  •  标签:

我有一个遗留数据库,其中有一堆像白痴一样命名的列,比如:

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. Is what I m trying to do even possible?
  2. If so, what s the best way to do it (iterative aliasing or overwriting method missing)?
  3. If it s not too much trouble, a very brief code sample of how to do #2 would be awesome.

提前感谢此贴收到的任何答复。

最佳回答

你的问题可能是因为attributes 是一个实例方法,而你在类的上下文中这样做。离你想要的最近的类方法是column_names

问题回答

你可以做一些像这样的事情:

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

哦,我想出了一个小做法,我觉得很优雅...

不确定这是否有效,但我将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

你可能不能把你的模块命名为“烂数据库方法”,但是你懂的;)一旦你定义了那个模块并将其塞进 lib 中,你只需要包含这个模块,然后你就可以看到效果了:D

如果你能尝试一下并且这个方法适用于你的话,我会很高兴听到你的回音 :)





相关问题
热门标签