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_attribute
和read_attribute
方法访问这些表列而不用将它们作为ruby方法调用。
正如Jaime所说,这些名字可能会导致问题。
在这种情况下,使用一些明智的名字。 你的graphics用户界面不应该指定你的列的命名方式。
build议: is_deleted
或deleted_at
, listen_control
然后,相应地改变你的观点,这比打ActiveRecord和你的数据库更容易。