71

Railsにはhas_one :through、2番目のモデルを通過することにより、3番目のモデルとの1対1の関連付けを設定するのに役立つ関連付けがあります。ショートカットの関連付けを作成する以外に、それを実際に使用する方法は何ですか。

Railsガイドからこの例を取り上げます。

class Supplier < ActiveRecord::Base
  has_one :account
  has_one :account_history, :through => :account
end

class Account < ActiveRecord::Base
  belongs_to :supplier
  has_one :account_history
end

class AccountHistory < ActiveRecord::Base
  belongs_to :account
end

次のようなことができるかもしれません:

supplier.account_history

そうでなければ、次のように到達します。

supplier.account.history

アクセスが簡単な場合は、技術的には、モデルをn-1モデルを経由するn番目のモデルに接続してアクセスを容易にする1対1の関連付けが存在する可能性があります。ショートカット以外に欠けているものはありますか?

4

3 に答える 3

59
  1. ロジック、これは少し弱いかもしれませんが、「私にはアカウントを持っているサプライヤーがいます。このサプライヤーのアカウント履歴全体を見たい」と言うのは論理的であるため、私にとっては理にかなっていますサプライヤーから直接アカウント履歴にアクセスできるようにします。

  2. 効率、これが私が を使用する主な理由です。これは:through、単にサプライヤー、アカウント、account_history を呼び出すのではなく、結合ステートメントを発行するためです。データベース呼び出しの数に気付きましたか?

    • を使用して:through、サプライヤーを取得するための 1 回の呼び出し、account_history を取得するための 1 回の呼び出し (Rails は:join、アカウントを介して取得するために自動的に使用します)

    • 通常の関連付けを使用して、サプライヤーを取得するための 1 回の呼び出し、アカウントを取得するための 1 回の呼び出し、および account_history を取得するための 1 回の呼び出し

それが私が思うことです=)それが役に立てば幸いです!

于 2010-01-22T09:10:27.180 に答える
14

誰もAssociation Objectsに触れていないことに驚いています。

(has_manyまたはhas_one)関係は、関連付けオブジェクト パターン:throughの使用を容易にします。これは、互いに関連する 2 つのものがあり、その関係自体に属性 (つまり、関連付けが作成された日付または有効期限が切れる日付) がある場合です。

これは、 ActiveRecord ヘルパーの優れた代替手段であると考えられています。has_and_belongs_to_manyこの背後にある理由は、関連付けの性質を変更したり追加したりする必要がある可能性が非常に高いということです。プロジェクトを開始して数か月になると、関係が最初に次のように設定されていた場合、これは非常に苦痛になる可能性があります。 a has_and_belongs_to_many(2 番目のリンクで詳しく説明しています)。最初にリレーションシップを使用してセットアップした場合has_many :through、プロジェクトの数か月後には、結合モデルの名前を変更したり、属性を追加したりするのが簡単になり、開発者が要件の変化に簡単に対応できるようになります。変更を計画します。

于 2014-09-09T19:10:16.613 に答える