"president_id" belongs_to :vice_president, -6ren">
gpt4 book ai didi

ruby-on-rails - 同一模型的多个关联

转载 作者:行者123 更新时间:2023-12-03 16:09:34 25 4
gpt4 key购买 nike

我有两个类,我想指定如下:

class Club < ActiveRecord::Base
belongs_to :president, :class_name => "Person", :foreign_key => "president_id"
belongs_to :vice_president,
:class_name => "Person",
:foreign_key => "vice_president_id"
end

class Person < ActiveRecord::Base
has_one :club, :conditions =>
['president_id = ? OR vice_president_id = ?', '#{self.id}', '#{self.id}']
end

这不起作用,并且在尝试从 person 对象获取俱乐部关联时出现错误。错误是因为我在查看 SQL 时正在俱乐部表中查找 person_id。我可以通过声明多个 has_one 关联来绕过它,但感觉这是不正确的做法。

一个人只能是一个俱乐部的主席或副主席。

任何人都能够就这个问题提供一点建议,我将不胜感激。

最佳答案

您的 has_one据我所知,条件永远不会在 Rails 中工作。

您需要一个明确的 has_onebelongs_to或 has_many 每个“链接”,在两个表上。因此,如果您有两个“链接”,则需要两个 has_one和两个 belongs_to .这就是它的工作原理。

其次,我认为你应该重新考虑你的模型。按照您的做法,一个人不能同时担任俱乐部主席和员工。或者成为两个俱乐部的主席。即使你现在没有这些,它们也可以在 future 出现——现在保持灵活性会更容易。

一种灵活的方法是使用 has_many :through带有指定角色的中间表。换句话说:

# The memberships table has a person_id, club_id and role_id, all integers

class Membership < ActiveRecord::Base
belongs_to :club
belongs_to :person
validates_presence_of :role_id
validates_numericality_of :role_id
end

class Club < ActiveRecord::Base
has_many :memberships, :dependent => :delete_all
has_many :people, :through => :memberships
end

class Person < ActiveRecord::Base
has_many :memberships, :dependent => :delete_all
has_many :clubs, :through => :memberships
end

现在,假设 role_id=0 表示员工,role_id=1 表示总裁,role_id=2 表示副总裁,您可以这样使用它:
tyler = Person.find(1) # person_id is 1
other = Person.find(2) # person_id is 2
c = Club.find(1) # club_id is 1

tyler.clubs # returns all the clubs this person is "member" of
c.people # returns all the "members" of this club, no matter their role

#make tyler the president of c
tyler.memberships.create(:club_id => 1, :role_id => 1)

#make other the vicepresident of c
#but using c.memberships instead of other.memberships (works both ways)
c.memberships.create(:person_id => 2, :role_id => 1)

#find the (first) president of c
c.memberships.find_by_role_id(1).person

#find the (first) vicepresident of c
c.memberships.find_by_role_id(2).person

#find all the employees of c
c.memberships.find_all_by_role_id(0).collect { |m| m.person }

#find all the clubs of which tyler is president
tyler.memberships.find_all_by_role_id(1).collect { |m| m.club }

补充说明:
  • 您可以使用角色表和模型对此进行补充。角色只有一个名字,角色是 have_many关系和成员(member)资格将 belong_to角色。或者,您可以在成员资格中定义获取角色名称的方法(如果为 0,则返回“员工”,如果为 1,则返回“总裁”等
  • 您可以添加对成员(member)资格的验证,这样指定俱乐部的主席不得超过 1 人,同一俱乐部的同一员工不得担任两次。稍后,如果您开始遇到一个人需要在两个地方的“特殊情况”,您将只需要调整您的验证。
  • 关于ruby-on-rails - 同一模型的多个关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2219559/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com