私のDBテーブルとフィールド名はCamelCaseにあります。それらの名前をその場でsnake_caseに変換することは可能ですか?モデルメソッドをきれいに見せるために?
アプリはJRubyOnRails3.0/ MSSQL DB/ActiveRecord-JDBC-adapterです。
私のDBテーブルとフィールド名はCamelCaseにあります。それらの名前をその場でsnake_caseに変換することは可能ですか?モデルメソッドをきれいに見せるために?
アプリはJRubyOnRails3.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
:
class CamelCasedBaz < ActiveRecord::Base
...
alias_attribute :preferred_delivery, :DeliveryFrequency
end
覚えておくべき重要なことの1つは、rubyまたはrailsのキーワードまたはマジックフィールド名である列名に注意することです。
Railsには、従来のデータベースのテーブル名と列を回避できるメタプログラミングの優れた機能がすべて備わっているようです。「RubyonRails3 Model WorkingwithLegacyDatabase」に関するJonathanHuiのブログ投稿を読むことをお勧めします。また、safe_attributesgemを確認することをお勧めします。
私も同じ必要がありました。table_nameとprimary_keyを設定するという@buruzaemonの答えは良いですが、それを改善するためのいくつかの提案があります。
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
camelize
このモジュールは、ActiveSupportのメソッドに依存します。
うん!お見舞い申し上げます。エンジンが他のマラキーを許可している場合でも、私は常にold_school.namesが好きです...
これはレガシーアプリだと思いますか?
Railsアプリが動作する一連のビューを作成してみませんか?
RubyonRailsは独創的なソフトウェアです。これは、設計者が特定の方法で物事を行うことを選択したことを意味し、RoRを成功、喜び、使いやすさ、滑らかさなどで使用できるようにするには、その特定の方法で行う必要があります。そのため、RoRのテーブルと列の命名規則に従うことができない、または従いたくない場合は、別のフレームワークを選択することをお勧めします。
ただし、RoRを維持したいがsnake_case
メソッド名が必要な場合は、クラスを開き、ActiveRecord::Base
未定義のメソッドへの呼び出しをインターセプトし、それらが^[a-z]+(_[a-z]+)*$
通常の例外と一致することを確認し、一致する場合は、大文字に変換して大文字のメソッドを呼び出すことができます。しかし、私はあなたにそれをしないように強くお勧めします!!! *:D