あなたの質問は私にはっきりと分かりません。
レールの規則では、モデル名は単数で、キャメルケースで書かれています(例: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_contacts
はPersonalContact
の配列を返します。
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がどのように動作しているかをドキュメントで確認できます。
私はクラス名を大文字にする必要があり、instruction_productは有効なクラス名ではないことを理解します。 InstructionsProductsがレールで有効なモデル名であるのはなぜですか? –
@AndrewStuntz私はもっと明確に説明しました、私に教えてください。 –
私はこの答えで100%満足しているわけではありませんが、答えはそれ以下ではありません。ありがとうございました。私は自分自身でさらに研究をします。私の主な問題は、レールがテーブル名をどのように扱うかについての誤った方法を見ていることだったと思います。もっと面白いものがあれば更新します。 –