在Rails DB中使用CamelCase而不是snake_case

我的数据库表和字段名称在CamelCase中。 是否可以将这些名称转换为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 

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

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

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

Rails似乎具有所有元编程优点,允许您处理遗留数据库表名和列。 您可能希望阅读Jonathan Hui关于“Ruby on Rails 3模型使用旧数据库”的博客文章。 你可能想看一下safe_attributes gem。

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

我认为这是一个遗留应用程序?

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

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

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

我有同样的需要。 @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 =~ /^[az]+(?:_[az]+)*[?=!]?$/ end end 

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

    Interesting Posts