首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Rails DB中使用CamelCase而不是snake_case

在Rails DB中使用CamelCase而不是snake_case
EN

Stack Overflow用户
提问于 2011-05-12 16:05:02
回答 4查看 4.2K关注 0票数 6

我的DB表和字段名都在CamelCase中。有没有可能将这些名称即时转换为snake_case?为了让模型方法看起来更漂亮?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-13 23:57:56

@arkadiy,事实上,就在这一天,我也在研究这个问题。

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

代码语言:javascript
复制
class CamelCasedFoo < ActiveRecord::Base
  set_table_name :CamelCasedTable
end

对于像主键这样的东西,我们有set_primary_key

代码语言:javascript
复制
class CamelCasedBar < ActiveRecord::Base
  ...
  set_primary_key "CamelCasedTableID"
end

而且应该可以使用alias_attribute将时髦的遗留列名命名为对rails更友好的名称

代码语言:javascript
复制
class CamelCasedBaz < ActiveRecord::Base
  ...
  alias_attribute :preferred_delivery, :DeliveryFrequency
end

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

Rails似乎具有所有元编程的优点,允许您处理遗留的数据库表名和列。你可能希望阅读一下许仕仁在"Ruby on Rails 3 Model Working with Legacy Database"上的博客文章。你可能想看看safe_attributes的精华。

票数 6
EN

Stack Overflow用户

发布于 2014-04-03 02:26:32

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

我认为set_*风格的方法已经失宠了,现在推荐直接设置属性。所以

代码语言:javascript
复制
class Project < ActiveRecord::Base
  self.table_name = 'Projects'
  self.primary_key = 'ProjectId'
end

此外,使用alias_attribute手动为每个属性设置别名似乎很繁琐。这似乎也很容易忘记一件事。尽管@Behrangf不建议这样做,但我不认为使用一点元编程魔术自动提供snake_case版本的属性有什么错。自动执行此操作的I've created a module。它甚至没有绑定到Ruby,所以您也可以在ActiveRecord包装器或其他镜像不遵循Ruby约定的系统的东西中使用它。我正在跟踪Gist上的模块,但为了方便起见,我将其复制到下面:

代码语言:javascript
复制
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方法。

票数 1
EN

Stack Overflow用户

发布于 2011-05-13 09:16:37

真讨厌!我深表同情。我一直都喜欢old_school.names,即使引擎允许其他的马拉松键...

我假设这是一个遗留的应用程序?

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5975081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档