我有一个遗留数据库,里面有一堆白痴命名的列,如:
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?
但我也一直在错误地使用该路线。
所以我的问题(实际上是问题)是:
预先感谢这篇文章收到的任何答案。
答案 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
很想知道这是否适合你:)