Rails中列名的别名

在我的数据库中有列名,如“删除”或“监听控制”等。 这些不能改变,所以我想要别名,以避免在我的应用程序中的问题。

我发现下面的代码,但它是过时的(2005年8月5日),并不适用于Rails 3:

module Legacy def self.append_features(base) super base.extend(ClassMethods) end module ClassMethods def alias_column(options) options.each do |new_name, old_name| self.send(:define_method, new_name) { self.send(old_name) } self.send(:define_method, "#{new_name}=") { |value| self.send("#{old_name}=", value) } end end end end ActiveRecord::Base.class_eval do include Legacy end 

我怎样才能将列名别名? 可能吗?

在你的模型中声明这个。

 alias_attribute :new_column_name, :column_name_in_db 

别名方法名称不会解决您的问题。 正如我在上面的评论中提到的那样,ruby方法或variables名称中不能有破折号,因为ruby会将它们解释为“减号”。 所以:

 object.listen-control 

将被ruby解释为:

 object.listen - control 

并会失败。 你发现的代码片段可能会因为ruby 1.9而失败,而不是rails 3. Ruby 1.9不允许你再调用.send或者像protected之类的私有方法。

话虽如此,我知道有些时候,旧的数据库列名看起来不是很好,你想清理它们。 在名为“bellmyer”的lib文件夹中创build一个文件夹。 然后创build一个名为“create_alias.rb”的文件,并添加以下内容:

 module Bellmyer module CreateAlias def self.included(base) base.extend CreateAliasMethods end module CreateAliasMethods def create_alias old_name, new_name define_method new_name.to_s do self.read_attribute old_name.to_s end define_method new_name.to_s + "=" do |value| self.write_attribute old_name.to_s, value end end end end end 

现在在需要别名的模型中,可以这样做:

 class User < ActiveRecord::Base include Bellmyer::CreateAlias create_alias 'name-this', 'name_this' end 

它会正确的别名。 它使用ActiveRecord的read_attributeread_attribute方法访问这些表列而不用将它们作为ruby方法调用。

正如Jaime所说,这些名字可能会导致问题。

在这种情况下,使用一些明智的名字。 你的graphics用户界面不应该指定你的列的命名方式。

build议: is_deleteddeleted_atlisten_control

然后,相应地改变你的观点,这比打ActiveRecord和你的数据库更容易。