这是我的架构:
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
请注意,用户确实拥有_many 程序,他们管理的程序,以及通过参与者的has_many 程序,这是他们参与的所有程序。
我想要的是能够说:
- a_user.manages_programs
- a_user.participates_in_programs
所以有两种用户 has_many 程序。我需要对 :through、:as、:class 或类似的东西做一些神奇的组合,但到目前为止我还想不通。
另一个问题继续这个例子。我现在有
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
注意第三行。我想要的是利用这一系列的关联:一个参与者有一个 user_id 和一个 program_id。我希望能够说 u1.participating_programs 并获得该用户参与的一个或多个程序的列表,但上述方法不起作用。你能告诉我我在哪里吗?