6

私のDBテーブルとフィールド名はCamelCaseにあります。それらの名前をその場でsnake_caseに変換することは可能ですか?モデルメソッドをきれいに見せるために?

アプリはJRubyOnRails3.0/ MSSQL DB/ActiveRecord-JDBC-adapterです。

4

4 に答える 4

6

@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を確認することをお勧めします。

于 2011-05-13T15:57:55.590 に答える
1

私も同じ必要がありました。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のメソッドに依存します。

于 2014-04-02T18:26:32.427 に答える
0

うん!お見舞い申し上げます。エンジンが他のマラキーを許可している場合でも、私は常にold_school.namesが好きです...

これはレガシーアプリだと思いますか?

Railsアプリが動作する一連のビューを作成してみませんか?

于 2011-05-13T01:16:36.637 に答える
0

RubyonRailsは独創的なソフトウェアです。これは、設計者が特定の方法で物事を行うことを選択したことを意味し、RoRを成功、喜び、使いやすさ、滑らかさなどで使用できるようにするには、その特定の方法で行う必要があります。そのため、RoRのテーブルと列の命名規則に従うことができない、または従いたくない場合は、別のフレームワークを選択することをお勧めします。

ただし、RoRを維持したいがsnake_caseメソッド名が必要な場合は、クラスを開き、ActiveRecord::Base未定義のメソッドへの呼び出しをインターセプトし、それらが^[a-z]+(_[a-z]+)*$通常の例外と一致することを確認し、一致する場合は、大文字に変換して大文字のメソッドを呼び出すことができます。しかし、私はあなたにそれをしないように強くお勧めします!!! *:D

于 2011-05-13T11:43:16.170 に答える