如何在同一模型中进行 has_many 和 has_one 关联?

How to do has_many and has_one association in same model?

我需要在同一个模型中做两个关联。其中:

团队 has_many 用户 现在,我想要 团队 has_one 领导

此 "Leader" 将成为用户

我正在尝试使用 has_one throught,但我认为关联不起作用。

Leader.rb

class Leader < ActiveRecord::Base
belongs_to :user
belongs_to :team

Team.rb

class Team < ActiveRecord::Base
has_one :user, through: :leader
end

User.rb

class User < ActiveRecord::Base

belongs_to :team
has_one :captain

end

并在第 27 行出现以下错误:

NoMethodError in TeamsController#create

26 def create

**27 @team = current_user.teams.create(team_params)**

28 @team.save

29 respond_with(@team)

30 current_user.update(team_id: @team.id)

current_user.teams.create(team_params)

Teams 适用于 has_many 协会,您需要 current_user.create_team(team_params)

您在 userteam 之间有 has_one 关联。试试这个:

current_user.create_team(team_params)

此外,您应该添加从 teamleader 的适当反向关联。

class Team < ActiveRecord::Base
  belongs_to :leader
  has_one :user, through: :leader
end

在这种情况下,我认为您需要 2 个模型就足够了

1).用户模型

class User < ActiveRecord::Base
   belongs_to :team
end

2).团队模型

 class Team < ActiveRecord::Base
   has_many :users
   belongs_to :leader, class_name: 'User', foreign_key: :leader_id
 end

如何在名为 leader 的用户 table 中设置一个 boolean 标志?然后你的协会可以变成:

class Team < ActiveRecord::Base   
  has_many :users   
  has_one :leader, class_name: 'User', -> { where leader: true }
end

Team has_many User Now, I want that Team has_one Leader

This "Leader" will be a User

使用继承(也叫子类化),Leader是一个User

class User < ActiveRecord::Base
    belongs_to :team
end

class Leader < User
end

class Team < ActiveRecord::Base
    has_many :users
    has_one :leader
end

您的用户 table 也很重要。确保用户在其 create_table 方法中具有 t.belongs_to :teamt.string :type。请注意,Leader 是一个 User,不需要单独的 table,但是您需要允许 ActiveRecord 记录其类型,以便稍后可以 return 正确的模型。

参考文献:

inheritance 具体来说你需要 'single table inheritance'

belongs_to 向下滚动 has_one 和 has_many,此处使用的三个关系。