2011-10-04 44 views
0

我正在处理一个大型的web应用程序,我们的数据库模式是这样的,大多数表列(id列是一个大的例外)都以表名的缩写为前缀。Rails和数据库列前缀?

我们希望将应用程序移植到Rails,但似乎根据Rails的实践,列名不应以这种方式作为前缀。

是否可以使用列名前缀的钢轨?我知道表名称前缀是受支持的,但我没有看到关于列名的任何信息。

任何Rails专家都有什么想法?

+1

做你尝试运行轨道G型aTableName。其中aTableName是BD中的表。通过这种方式,您可以看到导轨如何与字段配合使用。 – Cygnusx1

+0

我会研究一下。我假设,对于不像'id'或'office_id'等那样特殊的列,Rails只会将该列解释为模型实例中属性的名称。我会认为这将工作正常。然而,这并不是惯例,这很麻烦。 –

+0

的确,你的id将是主要的id,而office_id将是一个外键。对于其他领域,我只是假设rails会让你用列的名字来访问它们! – Cygnusx1

回答

2

嗯,我看不到任何前缀列的问题(抛开它使用起来有点无聊)。

无论如何,说你有u_name用户模型name等等

这将是很酷的事:的User.first.name

代替:User.first.u_name

为了实现这个目标,我建议这个未经测试的元编程,你应该把它放在初始化器中。

class ActiveRecord::Base 
    def self.pretty_columns(prefix) 
    skipped_columns = ["id"]  #add whatever column name you want here 
    columns.each do |column| 
     column_name = column.name 
     unless skipped_columns.include? column_name 
     unprefixed_col = (column_name.scan /^#{prefix}(.*)/).flatten.first 

     define_method "#{unprefixed_col}" do 
      self.send "#{column_name}" 
     end 

     define_method "#{unprefixed_col}=" do |value| 
      self.send(column_name, value) 
     end   
     end 
    end 
    end 
end 

然后在您的用户模式:

class User < ActiveRecord::Base 
    pretty_columns :u_ 
end 
+0

好的,很酷。看起来像会动态生成将包装到正确的方法。我会考虑这一点,但我可能只是做一些小心的重构,并将模式迁移到Rails更自然的事情上。我们将看到... –

+0

还有其他各种您需要在此处定义的生成方法,例如field_was?,field_changed ?,等等。所以这个解决方案让我觉得有些诡异。 – mgadda