2011-01-05 8 views
1

Java with SQL Serverデータレイヤーで作成された新しく開発されたアプリケーションのRails 3フロントエンドを開始します。Rails 3 - Pascal Caseのカラム名を使用して簡単に作業する

以前の経験から、すべての列名はパスカルケース(Id、Name、MyTableId)であり、テーブル名は単数形(複数化されていない)です。このデータモデルで作業するために、デフォルトのレール規則を簡単にグローバルに上書きする方法はありますか?

これはset_table_nameと列のエイリアシングを使用することで実現できますが、既存のドメイン層のコードベースを複製する必要があるため、Railsを使用してアプリケーションをすばやく開発するという目的に反することがあります。

私は以下のコードスニペットが私のニーズをいくらか満たしていることを発見しました。これが最善の方法ですか、これはまだ有効ですか?問題の

http://snippets.dzone.com/posts/show/2034

+0

あなたのジェネレータは依然としてRubyスタイルの命名規則を主張しますが、スニペットリンクは必要なものです。 –

答えて

2

一部はActiveRecordの::ベースのオプションによって解決されます。あなたのenvironments.rbでは、あなたの他の問題が

ActiveRecord::Base.pluralize_table_names = false 

を入れて、私の知る限り、モデルジェネレータコードにダイビングすることで解決し、どこにその列名にそれマッサージあなたの属性を発見する必要があります。データベースとそのスキーマがあなたの大会に従えば、ActiveRecordは(私の理解から)その慣習でその属性を自動的に生成するはずです。これをテストする簡単な方法は、コンベンションで素早くレコードを作成し、そのレコードでモデルを作成し、rails/consoleを使用してそのモデルのインスタンスに対してcolumn_namesの結果を出力することです。

編集:上の編集から、ActiveRecordのmethod_missingが大文字小文字を強制している可能性があります。しかし、そのリンクを使用することでその問題を解決するはずです。

もちろん、スコープ解決演算子のない大文字小文字の項目はオブジェクトではなく定数であるため、パスカルの場合はRubyで頭痛を引き起こす可能性があることに注意してください。たとえば:

class Foo 
    attr_reader :low,:Cap 


    def initialize 
    @low = "lowtest" 
    @Cap = "Captest" 
    end 

    def bar 
    self.low #<==works 
    self.Cap #<==works 
    end 

    def baz 
    low  #<==works 
    Cap  #<==raises NameError 
    end 
end 

これはちょうどあなたのモデルコードが正しくとにかくやるべきselfを、使用する必要がありますを意味します。

0

ここで私はウィルソナの助けを借りてきた。回答ごとに、

ActiveRecord::Base.pluralize_table_names = false 

to environment.rbを追加しました。

私のモデルディレクトリにこのクラスを追加し、すべてのモデルにそれを継承させました。

class PascalCaseActiveRecord < ActiveRecord::Base 
    self.abstract_class = true 

    # all columns are uppercase 
    set_primary_key 'Id' 

    def self.reloadable? 
    false 
    end 



    # convert to camel case attribute if in existence 
    # record.name => record.Name 
    # record.id => record.Id 
    def method_missing(method_id, *args, &block) 
    method_id = method_id.to_s.camelize if @attributes.include? method_id.to_s.camelize.gsub(/=/, '') 
    super(method_id, *args, &block) 
    end 

# def self.method_missing(method_id, *args) 
# # if its a finder method 
# if method_id.to_s.match(/^find_by_/) 
#  puts "Before camelize #{method_id}" 
#  s2 = method_id.to_s.sub("find_by_","").split('_and_') 
#  s2.collect! {|s| s.camelize} 
#  method_id = "find_by_" + s2.join("_and_") 
#  puts "After camelize #{method_id}" 
# end 
#  
# super(method_id, *args) 
# end 
# 
    # strip leading and trailing spaces from attribute string values 
    def read_attribute(attr_name) 
    value = super(attr_name) 
    value.is_a?(String) ? value.strip : value 
    end 

    class << self # Class methods 

    private 
     # allow for find_by and such to work with uppercase attributes 
     # find_by_name => find_by_Name 
     # find_by_dob_and_height => find_by_Dob_and_Height 
     def extract_attribute_names_from_match(match) 
     match.captures.last.split('_and_').map { |name| name.camelize } 
     end 
    end 
end 
関連する問題