1

我有一个遗留数据库,其中包含一堆白痴命名的列,例如:

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

在我的类定义中,出现“未定义的局部变量或方法‘属性’”错误。我也尝试过覆盖这些方法:

方法缺失
回应?

但我也一直在这条路线上遇到错误。

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

  1. 我想要做的甚至可能吗?
  2. 如果是这样,最好的方法是什么(迭代别名或覆盖方法缺失)?
  3. 如果不是太麻烦,那么如何做#2 的非常简短的代码示例会很棒。

提前感谢这篇文章收到的任何答案。

4

3 回答 3

2

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

于 2009-02-04T01:51:40.790 回答
1

您可以执行以下操作:

methods.each do |method|
  if method.ends_with("_c") then
    self.send(:defind_method,method.slice(0,-2)){self.send(method)}
  end
end
于 2009-02-04T01:53:14.330 回答
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

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

于 2009-02-04T05:46:38.460 回答