CamelCase而不是Rails DB中的snake_case



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

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

>@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

并且应该可以将时髦的遗留列名称别名为对 rails 更友好的alias_attribute

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

要记住的关键一点是注意任何 ruby 或 rails 关键字或魔术字段名称的列名。

Rails似乎具有所有这些元编程的优点,允许您解决遗留的数据库表名称和列。您可能希望阅读Jonathan Hui的博客文章"Ruby on Rails 3 Model Working with Legacy Database"。您可能想看看safe_attributes宝石。

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

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

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

此外,使用 alias_attribute 手动为每个属性添加别名似乎很乏味。似乎也很容易忘记一个。尽管@Behrangf建议不要这样做,但我不认为使用一点元编程魔法来自动提供属性的snake_case版本有什么问题。我创建了一个自动执行此操作的模块。它甚至没有绑定到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方法。

糟糕! 你有我的同情。 我一直喜欢old_school.names,即使引擎允许其他恶意......

我认为这是一个旧版应用程序?

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

Ruby on Rails是一个固执己见的软件。这意味着它的设计师选择以特定的方式做事,为了能够成功、愉快、轻松、流畅地使用 RoR,您必须以这种特定的方式进行。因此,如果您不能或不想遵循 RoR 的表和列命名约定,建议您选择另一个框架。

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

相关内容

  • 没有找到相关文章

最新更新