在Rails DB中使用CamelCase而不是snake_case

时间:2011-05-12 08:05:02

标签: ruby-on-rails ruby jruby activerecord-jdbc

我的数据库表和字段名称在CamelCase中。是否可以将这些名称转换为snake_case?使模型方法看起来很漂亮?

该应用程序是JRubyOnRails 3.0 / MSSQL DB / ActiveRecord-JDBC-adapter。

4 个答案:

答案 0 :(得分:5)

@ arkadiy,事实上,我正在调查这一天。

对于表名,我们当然有set_table_name方法:

class CamelCasedFoo < ActiveRecord::Base
  set_table_name :CamelCasedTable
end

对于主键这样的内容,我们有set_primary_key

class CamelCasedBar < ActiveRecord::Base
  ...
  set_primary_key "CamelCasedTableID"
end

应该可以将时髦的旧版列名称添加到alias_attribute更友好的栏目中:

class CamelCasedBaz < ActiveRecord::Base
  ...
  alias_attribute :preferred_delivery, :DeliveryFrequency
end

要记住的一件重要事情是注意任何ruby或rails keywordsmagic field names的列名。

Rails似乎具有所有元编程优点,允许您处理旧的db表名和列。您可能希望在"Ruby on Rails 3 Model Working with Legacy Database"上阅读Jonathan Hui的博客文章。你可能想看一下safe_attributes gem。

答案 1 :(得分:1)

我有同样的需要。 @buruzaemon设置table_name和primary_key的答案很好,但我有一些建议可以让它更好。

我认为set_ *样式方法已经失宠了,现在建议直接设置属性。所以

class Project < ActiveRecord::Base
  self.table_name = 'Projects'
  self.primary_key = 'ProjectId'
end

另外使用alias_attribute手动别名每个属性似乎很乏味。它似乎也很容易忘记一个。尽管@Behrangf建议不要使用它,但我没有发现使用一点元编程魔法自动提供属性的snake_case版本有什么问题。 I've created a module自动执行此操作。它甚至没有绑定到ActiveRecord,因此您也可以在API包装器或其他镜像不遵循Ruby约定的系统中使用它。我正在跟踪Gist上的模块,但为方便起见,请转载如下:

module Snakeable

  # Patch in our automatic snake_case methods
  def method_missing method, *args 
    if is_snake_case?(method) &&
      respond_to?(camelized = method.to_s.camelize.to_sym)
      send camelized, *args
    else
      super
    end
  end

  # So the object including this module will respond to
  # Object#respond_to? correctly
  def respond_to? method, *args
    super || (
      is_snake_case?(method) &&
      super(method.to_s.camelize.to_sym, *args)
    )
  end

  private

  # Is the given method using the snake_case format
  def is_snake_case? method
    method.to_s =~ /^[a-z]+(?:_[a-z]+)*[?=!]?$/
  end

end

此模块依赖于ActiveSupport的camelize方法。

答案 2 :(得分:0)

呸!你有同情心。我总是喜欢old_school.names,即使引擎允许其他malarkey ...

我认为这是一款传统应用?

如何为您的rails应用程序创建一组视图?

答案 3 :(得分:0)

Ruby on Rails是opinionated software。这意味着它的设计师选择以特定的方式做事,并且能够使用RoR成功,愉悦,轻松,顺畅等等,你必须以这种特定的方式做到这一点。因此,如果您不能或不想遵循RoR的表和列命名约定,建议您选择另一个框架。

但是,如果您希望继续使用RoR但是需要snake_case方法名称,则可以打开ActiveRecord::Base类,拦截对未定义方法的调用,确保它们与^[a-z]+(_[a-z]+)*$常规方法匹配异常,如果是这样,将它们转换为大写并调用大写方法。 但我强烈建议你不要这样做!* :D