3

Ruby の特定のデータ モデルについて質問があります。一連のビジネス要件があります。

ユーザーは多くのワークショップを作成できます

ユーザーは多くのワークショップに参加できます

ワークショップには 1 人の所有者 (ユーザー) がいます

ワークショップには多くの参加者 (ユーザー) がいます

この関係の最初の部分は簡単にセットアップできます。

#user.rb
class User < ActiveRecord::Base
    has_many :workshops
end

#workshop.rb
class Workshop < ActiveRecord::Base
    belongs_to :user
end

しかし、ワークショップからユーザーへの「その他の has_many」関係をどのように作成するのでしょうか。ワークショップのようなことはできますか?ワークショップ has_many :users, :as :attendees?

これについてどう思いますか。さらに悪いことに、ワークショップには参加者の制限があるため、検証が必要です...

ありがとう、ダニエル

4

1 に答える 1

3

has_many 対 has_many の関係があるため、関係を関連付ける新しい連想テーブルを作成する必要があります (出席と呼びましょう)。

データベース移行を作成します。

Rails Gモデルの出席

次に、移行で次のようにします。

create_table :attendances do |t|
    t.integer :attendee_id
    t.integer :workshop_id
end

add_index :attendances, :attendee_id
add_index :attendances, :workshop_id
add_index :attendances, [:workshop_id, :attendee_id]

これで、多くの出席者を多くのワークショップに関連付けることができるテーブルができました。

ユーザーモデルで:

has_many :attending, through: :attendances, foreign_key: 'attendee_id', class_name: 'Workshop', source: :workshop

ワークショップ モデルで:

has_many :attendees, through: :attendances, class_name: 'User', source: :attendee    

したがって、'some_user.attending' は some_user が参加しているすべてのワークショップの ActiveRecord リレーションを返し、'some_workshop.attendees' は some_workshop に参加しているすべてのユーザーを返します。

于 2012-06-27T20:37:59.567 に答える