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

请注意,用户确实拥有_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 并获得该用户参与的一个或多个程序的列表,但上述方法不起作用。你能告诉我我在哪里吗?

4

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

由于您似乎需要区分两种不同类型的用户,因此该polymorphic功能会派上用场。那么你就不需要额外的参与者表了。见这里

于 2013-01-11T21:55:43.793 回答