【问题标题】:Rails and database column prefixes?Rails和数据库列前缀?
【发布时间】:2011-10-04 19:21:01
【问题描述】:

我正在开发一个大型 Web 应用程序,我们的数据库架构使得大多数表列(id 列是一个大的例外)都以表名的缩写作为前缀。

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

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

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

【问题讨论】:

  • 您是否尝试运行 rails g 模型 aTableName。其中 aTableName 是您的 BD 中的一个表。通过这种方式,您可以看到 rails 在字段中的表现。
  • 我会调查的。我会假设,对于像idoffice_id 等不特殊的列,Rails 只会将该列解释为模型实例中的属性名称。我会认为这会很好。不过,还没有建立惯例,这很麻烦。
  • 确实,您的 id 将是主 id,而 office_id 将是外键。对于其他字段,我只是假设 rails 会让您使用列名访问它们!

标签: ruby-on-rails database-schema


【解决方案1】:

好吧,我看不出前缀列有任何问题(撇开它使用起来有点无聊)。

不管怎样,假设你有一个带有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? 等。所以这个解决方案让我觉得有点 hack。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
相关资源
最近更新 更多