0

私は最初の rails(3) アプリケーションを実行しています。

アソシエーションは意味がありません。まず、Rails ガイドでさえ、何をするのかを実際には説明しておらず、使い方を説明しているだけです。私が集めた情報によると、協会は次の 2 つのことを行います。

    a) Allow ActiveRecord to optimize the structure of the database.
    b) Allow ActiveRecord to offer an alternate ruby syntax for
       joins and the like (SQL queries). I want this.

関連付けと、それらを適切に使用する方法を理解しようとしています。以下の例に基づいて、関連付けが「壊れている」か、少なくともドキュメントが壊れているようです。

私のアプリケーションの簡単なバージョンを考えてみましょう。学習のために単語リストを修正する教師。

この説明に関連する 3 つの表があります。わかりやすくするために、annotate(1) ツールのテーブルの定義を含め、不要なフィールド/列を削除しました。

単語リスト管理テーブル:

    Table name: wordlist_mgmnt_records
    id         :integer         not null, primary key
    byline_id  :integer(8)      not null

単語を単語リストにマップする表:

    Table name: wordlists
    wordlist_mgmnt_id :integer         not null
    word_id           :integer         not null

私たちは実際には言葉自体を気にしません。しかし、最後の表であるバイラインは気にします。

    Table name: bylines
    id           :integer(8)      not null, primary key
    teacher_id   :integer         not null
    comment      :text            not null

バイラインは、誰が、どのツールを、どこで、いつ使用したかなどを記録します。バイラインは主に、何が起こったのかをトラブルシューティングするために使用されるため、ユーザーに何をすべきか (および/または間違いを修正する) を説明できます。

教師は、一度に 1 つまたは複数の単語リスト管理レコードを変更できます (単一のバイラインとも呼ばれます)。別の言い方をすれば、1 つの変更で複数の単語リストが更新される場合があります。

wordlist_mgmnt_records の場合、関連付けは次のようになります。

    has_many :bylines       # the same byline id can exist
                            # in many wordlist_mgmnt_records

しかし、署名欄に対応するエントリは何ですか?

Beginning Rails 3 (Carneiro 他) の本には次のように書かれています。

    "Note: For has_one and has_many associations, adding a belongs_to
    on the other side of the association is always recommended. The
    rule of thumb is that the belongs_to declaration always goes in
    the class with the foreign key."

[はい、オンラインの Rails ガイドも参照しました。役に立ちませんでした。]

Bylines テーブル/クラスについて、本当に言いたいことはありますか?

    belongs_to :wordlist_mgmnt_records

それは本当に意味がありません。bylines テーブルは、基本的に bylines_id を持つデータベース内のすべてのテーブルに属しています。それで、私は本当にそれらすべてに属していると言うでしょうか? それは他のすべてのテーブルに外部キーを設定しませんか? その結果、私が実際に望んでいたよりも変更のコストが高くなります (CPU サイクルが多すぎます)。いくつかの変更は多くのテーブルに影響を与え、そのうちのいくつかは非常に大規模です。私は通常の使用では速度を重視しており、バイラインをクリーンアップ/修復に使用する場合は、外部キーのないバイラインが見つかるのを待ちたいと思っています。

これで一周できます。関連はレールで実際に何をしているのでしょうか? また、それらをどのように賢く使うのでしょうか?

関連付けを使用することは正しい答えではないように思われますが、それ以外の方法で追加された結合構文を取得するにはどうすればよいでしょうか?

4

1 に答える 1

0

私はあなたの混乱を助けようとします...

署名記事は複数持つことができるwordlist_mgmnt_recordsので、そこを定義するhas_manyことは理にかなっているようです。

私はあなたの混乱を他の方向に理解しているのかわかりません。属性を定義したのでwordlist_mgmnt_records.byline_id、任意の指定wordlist_mgmnt_recordは1つの署名記事(belong_to)のみを持つことができます。ルビーを介してカラスの足を定義しているだけです(データベース図が好きな場合):

wordlist_msgmnt_records (many)>>----------(one) byline

または英語で読む:「1つの署名記事には多くのwordlist_mgmntsを含めることができ、多くの個別のwordlist_mgmntは1つの署名記事に属することができます」

定義をwordlist_mgmntモデルに追加しても、クエリのパフォーマンスには影響しません。次のようなことを実行できます。

@record = WordlistMgmntRecord.find(8)
@record_byline = @record.byline

さらに、次のようなテーブルで結合を行うことができます。

@records = WordlistMgmntRecord.joins(:byline).where({:byline => {:teacher_id => current_user.id}})

これはこのSQLを実行します:

SELECT wordlist_mgmnt_records.*
FROM wordlist_mgmnt_records
INNER JOIN bylines
  ON wordlist_mgmnt_records.byline_id = bylines.id
WHERE bylines.teacher_id = 25

current_user.id( 25を返したと仮定)

これは、現在のDB設計に基づいています。テーブルに外部キーを持たずに必要な機能を実装できる方法がある場合は、それに対応するようにモデルを変更します。ただし、これは正規化されたデータベースがどのように見えるかであるように思われ、他にどのような方法でそれを行うかはよくわかりません。byline_idwordlist_mgmnt_records

于 2011-06-16T23:14:46.520 に答える