2009-03-28 12 views
1

モデルのみが変更された場合、関係はどのように機能するのですか?Rails ActiveRecordの関係

"has__and___belongs___to__many"関係が必要な場合は、2つの外部キーを含むテーブルをどのようにする必要がありますか(Railsが使用できるようにする必要があります)?

答えて

2

短い回答:モデルに関連があると言うだけではありません。データベースには列もなければなりません。

関連するモデルをセットアップするとき、Railsはあなたが書いたことを見つけるための規約に従っていることを前提としています。次のようになります。

  1. テーブルをセットアップします。

    Railsの規則に従い、予測可能な特定の方法(複数の名詞、たとえばpeople)で表に名前を付けます。この表では、別の表との関係があるときに、その列を作成して別の予測可能な方法で名前を付ける必要があります(たとえば、bank_accounts表に関連する場合はbank_account_id)。

  2. あなたはActiveRecordを継承モデルクラスを記述::ベース

    class Person < ActiveRecord::Base

    あなたはこれらのモデルのいずれかをインスタンス化するとき、ActiveRecordの::基本コンストラクタは、クラスの名前を調べるに変換小文字にして複数化します。ここでは、Personを読むことによって、先に作成したテーブルの名前であるpeopleが生成されます。 ActiveRecordは人に関するすべての情報を取得する場所を認識し、SQL出力を読み込んで列の内容を把握することができます。

  3. モデルに関係を追加します:has_manybelongs_toまたはhas_oneです。

    あなたが何かのように、has_many :bank_accountsを入力すると、それはいくつかのことを前提としています

    1. あなたはに関連するモデルの名前は銀行口座の(キャメル・ケース:bank_accountsから)です。

    2. peopleテーブルの列の名前は、bank_account_id(特異化:bank_accounts)です。

    3. ActiveRecordはhas_manyなので、複数の名前を使用してjohn.bank_accountsのようなメソッドを提供します。一緒にそのすべてを置く

、ActiveRecordのは、あなたの個人の銀行口座を与えるSQLクエリを作成する方法を知っています。テーブルとその列を作成したときに理解できる命名規則に従ったため、すべてを見つける場所がわかります。

Rubyについてのすばらしい点の1つは、クラス全体でメソッドを実行でき、それらのメソッドがクラスに他のメソッドを追加できることです。それはまさにhas_manyと友達がやっていることです。

+0

"has_and_belongs_to_many"関係が必要な場合は、2つの外部キーを含むテーブルをどのようにする必要がありますか(Railsが使用できるように) – GeekJock

+0

ドキュメントは、このための素晴らしいリソースです。http://tinyurl.com/cnfm24 言い換えれば、結合テーブルの規則は、それぞれ字句的に複数のものです。マスターとペットのモデルでは、 'masters_pets'テーブルを作成します。列は 'master_id'と' pet_id'でなければなりません。 –

+0

ありがとう、それは私が探していたものです。 – GeekJock

2

これは、 "Convention over Configuration"に従っているためです。

顧客モデルに多数の注文があるとすると、レールにはordersテーブルにcustomer_idフィールドがあることが必要です。

これらの規則に従えば、レールがそれらの規則を使用し、所与の顧客のすべての注文を見つけるのに必要なSQLを構築することができます。

アプリケーションの開発中にdevelopment.logファイルを見ると、特定の顧客のすべての注文を選択するために必要なSQLが構築されていることがわかります。

あなたが尋ねることなくRailsはテーブルを作成しません。テーブルの作成は、テーブルを作成/変更するための移行を生成することによって実現されます。あなたが顧客モデルを作成し、その中にhas_many:ordersが入っていれば、ordersテーブルは作成されません。オーダー表を作成するには、マイグレーション内でそれを自分で行う必要があります。その移行の中で、ordersテーブルにcustomer_idフィールドを追加するには、customer_idカラムを追加するか、またはbelongs_to:customerステートメントを使用する必要があります。

+0

かなり便利です。 –

関連する問題