我正在处理一个大型的web应用程序,我们的数据库模式是这样的,大多数表列(id列是一个大的例外)都以表名的缩写为前缀。Rails和数据库列前缀?
我们希望将应用程序移植到Rails,但似乎根据Rails的实践,列名不应以这种方式作为前缀。
是否可以使用列名前缀的钢轨?我知道表名称前缀是受支持的,但我没有看到关于列名的任何信息。
任何Rails专家都有什么想法?
我正在处理一个大型的web应用程序,我们的数据库模式是这样的,大多数表列(id列是一个大的例外)都以表名的缩写为前缀。Rails和数据库列前缀?
我们希望将应用程序移植到Rails,但似乎根据Rails的实践,列名不应以这种方式作为前缀。
是否可以使用列名前缀的钢轨?我知道表名称前缀是受支持的,但我没有看到关于列名的任何信息。
任何Rails专家都有什么想法?
嗯,我看不到任何前缀列的问题(抛开它使用起来有点无聊)。
无论如何,说你有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
好的,很酷。看起来像会动态生成将包装到正确的方法。我会考虑这一点,但我可能只是做一些小心的重构,并将模式迁移到Rails更自然的事情上。我们将看到... –
还有其他各种您需要在此处定义的生成方法,例如field_was?,field_changed ?,等等。所以这个解决方案让我觉得有些诡异。 – mgadda
做你尝试运行轨道G型aTableName。其中aTableName是BD中的表。通过这种方式,您可以看到导轨如何与字段配合使用。 – Cygnusx1
我会研究一下。我假设,对于不像'id'或'office_id'等那样特殊的列,Rails只会将该列解释为模型实例中属性的名称。我会认为这将工作正常。然而,这并不是惯例,这很麻烦。 –
的确,你的id将是主要的id,而office_id将是一个外键。对于其他领域,我只是假设rails会让你用列的名字来访问它们! – Cygnusx1