私は最初の 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 サイクルが多すぎます)。いくつかの変更は多くのテーブルに影響を与え、そのうちのいくつかは非常に大規模です。私は通常の使用では速度を重視しており、バイラインをクリーンアップ/修復に使用する場合は、外部キーのないバイラインが見つかるのを待ちたいと思っています。
これで一周できます。関連はレールで実際に何をしているのでしょうか? また、それらをどのように賢く使うのでしょうか?
関連付けを使用することは正しい答えではないように思われますが、それ以外の方法で追加された結合構文を取得するにはどうすればよいでしょうか?