1

ここに私のスキーマがあります:

Participant = 
   id: int
   user_id: int
   program_id: int
   ... other fields
end

User = 
   id: int
   name: text
   ... other fields
end

Program = 
   id: int
   user_id:  int # this is the manager of the program
end

だから、英語で:

  • ユーザーは人です。
  • プログラムはユーザーによって管理されます。
  • プログラムには一連の参加者もあり、それぞれがユーザーです

Rails では次のようになります。

class Participant
   belongs_to :user
   belongs_to
end

class User
   has_many :programs
   has_many :participants
end

class Program
   has_many :participants
   belongs_to :user
end

ユーザーが実際に has_many のプログラム (ユーザーが管理するプログラム) と、参加者を介した has_many のプログラム (ユーザーが参加するすべてのプログラム) であることに注意してください。

私が望むのは、次のように言えるようになることです。

  • a_user.manages_programs
  • a_user.participates_in_programs

したがって、ユーザー has_many プログラムの 2 つのフレーバーがあります。:through、:as、:class、またはそれらの線に沿った何かの魔法の組み合わせを行う必要がありますが、今のところ理解できません。

この例に続く 1 つの追加の質問。私は今持っています

class User
  has_many :participations, class_name: "Participant"
  has_many :moderated_programs, class_name: "Program", foreign_key: 'moderator_id'
  has_many :participating_programs, through: :participations, class_name: "Program", source: :program
end

class Participant
  belongs_to :user
  belongs_to :program
end

3 行目に注目してください。私が望むのは、この一連の関連付けを利用することです。参加者には user_id と program_id があります。u1.participating_programs と言って、このユーザーが参加している 1 つまたは複数のプログラムのリストを取得できるようにしたいのですが、上記は機能しません。私が基地から離れている場所を教えてもらえますか?

4

2 に答える 2

2

私はチャールズに同意します、あなたは物事を混乱させるいくつかの言葉遣い/言語の問題を抱えています。参加はより良い用語かもしれません。ここでは多態性をお勧めしません。ユーザーには2つの異なる役割がありますが、ユーザーのタイプは異なりません。特にマネージャーが参加者になることが可能であれば...

class User
  has_many :participations
  has_many :programs, through: :participations
  has_many :managed_programs, class_name: 'Program'
end

class Program
  belongs_to :manager, class_name: 'User'
  has_many :participations
  has_many :users, through: :participations
end

# Just a join table.  Nothing special
class Participation
  belongs_to :user
  belongs_to :program
end
于 2013-01-11T22:12:57.223 に答える
1

まず、言語の問題です。ユーザーに多くの参加者がいるとは思いません。彼参加者であるかプログラムのマネージャーです。だから彼はむしろ多くの参加をしています。

これは次のように記述できます。

class User
    has_many :participations, class_name: "Participant"
    has_many :managed_programs, class_name: "Program"
end

また、少なくとも上記のコードでは、 Participant クラスがありません

belongs_to :user

2 つの異なるタイプのユーザーを区別する必要があるように見えるので、このpolymorphic機能は便利です。そうすれば、追加の参加者テーブルは必要ありません。ここ を参照してください

于 2013-01-11T21:55:43.793 に答える