26

私は Rails の初心者で、ポリモーフィックな HABTM 関係を作成しようとしています。問題は、関連付けたいモデルが 3 つあることです。

1 つ目は Event モデルで、次に 2 種類の出席者 (ユーザーと連絡先) です。

私がやりたいことは、出席者としてユーザーと連絡先の両方を関連付けることができるようにすることです。だから、私のコードで今持っているものは次のとおりです。

イベントモデル

has_and_belongs_to_many :attendees, :polymorphic => true

ユーザーモデル

has_and_belongs_to_many :events, :as => :attendees

連絡先モデル

has_and_belongs_to_may :events, :as => :attendees
  1. HABTM テーブルの移行はどのようにする必要がありますか? 私は少し混乱していて、それについて何の助けも見つかりませんでした。
  2. それはうまくいくでしょうか?
4

2 に答える 2

65

いいえ、それはできません。ポリモーフィックな has_and_belongs_to_many 関連付けなどはありません。

できることは、中間モデルを作成することです。おそらく次のようになります。

class Subscription < ActiveRecord::Base
  belongs_to :attendee, :polymorphic => true
  belongs_to :event
end

class Event < ActiveRecord::Base
  has_many :subscriptions
end

class User < ActiveRecord::Base
  has_many :subscriptions, :as => :attendee
  has_many :events, :through => :subscriptions
end

class Contact < ActiveRecord::Base
  has_many :subscriptions, :as => :attendee
  has_many :events, :through => :subscriptions
end

このように、サブスクリプション モデルは N:N 関係のリンク テーブルのように動作しますが、イベントに対してポリモーフィックな動作を行うことができます。

于 2011-08-06T06:38:00.557 に答える
0

Resolve parcialmente。

自由に使用できるフレームワークを考えると、問題は解決しますが、「不必要な」複雑さとコードが追加されます。中間モデル (私はこれを B と呼びます) を作成し、A -> B -> C が「A has_many B's which has_many C's」であると仮定すると、もう 1 つの AR クラス実装をメモリにロードする別の AR モデルができます。ロードされ、C インスタンスに到達するという唯一の目的でインスタンス化されます。:through アソシエーションを使用する場合、B アソシエーションをロードしないと常に言うことができますが、その場合、キャラバンが通り過ぎるのを見るためだけに存在する、さらに時代遅れのモデルが残ります。

実際、これは Active Record にはない機能かもしれません。それは私自身の懸念の原因であったため、追加する機能として提案します(それが、解決策を見つけたいと思ってこの投稿にたどり着いた方法です:))。

クンプリメントス

于 2012-09-07T09:22:26.490 に答える