2016-07-16 3 views
1

私はRuby 2.1.9とRails 3.2.17を実行しています。Rails 3はテーブルとモデルの命名規則を結合します

まず、Railsではモデルはほとんど常に単数でなければならないと私は常に仮定していました。私はproduct_categories_productのようなモデル名を見ました。これはうまくいきますし、あなたがモデルを関係者と一緒に働かせたいと思っている状況では、私はinstructions_productsを見ました。 Railsのソートは意味をなさないかもしれませんが、私はむしろモデルのinstruction_productに名前をつけたいと思います。これは、instructions_productsという名前のジョイン・テーブルに関連付けられていました。

実際に私は非常に不満を抱いていました。モデルの正しい名前であり、正しい表名に対応します。しかし、より適切なのは何ですか?

ActiveModel::Naming.singular(InstructionsProducts) 

戻りinstructions_products

編集:質問の心はなぜレールでInstructionsProducts有効なモデル名であり、なぜ単数形に解決上記の私の例をして「instructions_products」です。レールのコンベンションがモデル名を単数にすることを考えれば、これは奇妙に思えます。

答えて

1

あなたの質問は私にはっきりと分かりません。

レールの規則では、モデル名は単数で、キャメルケースで書かれています(例:InstructionProduct)。各モデルは、データベース内のテーブルと、同じ単語を使用して、「_」で区切られた複数の単語に対応しています。提供された例についてはinstruction_productsである。 has_manyを使用して、次の例で

ルック:

class User < ActiveRecord::Base 
    has_many :contacts 
end 

class Contact < ActiveRecord::Base 
    belong_to :name 
end 

user = User.find(1) 
user.contacts # returns an array of all the associated objects 

user.contactsをやって、連絡先がテーブル名ではありません。これはコレクションメソッドで、has_manyメソッドで渡されたシンボルのプレースホルダです(has_manyリンクに従って、has_manyについてのドキュメントを参照してください)。もう一つの名前は、しかし、使用することができます

class User < ActiveRecord::Base 
    has_many :personal_contacts, class_name: 'Contact' #, foreign_key: :contact_id 
end 

user = User.find(1) 
user.personal_contacts 

レールの規則が守られていないので、CLASS_NAMEおよびFOREIGN_KEYが必要とされています。 has_many :personal_contactsを使用している場合、personal_contactsPersonalContactの配列を返します。

Rubyでは、大文字の単語でクラス名を開始する必要があるため、instruction_productというクラスを作成することはできません。

Class AdminUser 
    self.table_name = "users" 
end 

アップデート1:

あなたはRailsの規則に従わない名前を提供したい場合は、私はお勧めしません。これは、新しいテーブル名についてのレールに通知する必要があります。あなたがすでに知っているように、モデルは単体として宣言されるべきであると述べています(class InstructionProductではなく、class InstructionsProductsですが、クラスはActiveRecord :: Baseから継承し、sqlクエリが生成されるとActiveRecordはクラス名を小文字にし、 _で単語を区切り、複数の名前に変換してテーブル名として使用します(主にレールにはInstructionsProducts.model_name.plural wh ichはinstructions_productsを返します)。

複数形で書かれていても、単数形は実際に単数形への名前変換を行いますが、そうではないと仮定しています。これは、あなたが規約を使用していることを前提とし、主にクラス名の下線を返します。

レールのソースコード(ActiveModel::Name)を見ると、ActiveSupport :: Inflector.underscoreが使用されているようです(私は非常に表面的な調査をしましたが、私は認めなければなりません)。 underscoreがどのように動作しているかをドキュメントで確認できます。

+0

私はクラス名を大文字にする必要があり、instruction_productは有効なクラス名ではないことを理解します。 InstructionsProductsがレールで有効なモデル名であるのはなぜですか? –

+0

@AndrewStuntz私はもっと明確に説明しました、私に教えてください。 –

+0

私はこの答えで100%満足しているわけではありませんが、答えはそれ以下ではありません。ありがとうございました。私は自分自身でさらに研究をします。私の主な問題は、レールがテーブル名をどのように扱うかについての誤った方法を見ていることだったと思います。もっと面白いものがあれば更新します。 –