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

Posted

技术标签:

【中文标题】如何在同一模型中进行 has_many 和 has_one 关联?【英文标题】:How to do has_many and has_one association in same model? 【发布时间】:2015-04-10 13:31:45 【问题描述】:

我需要在同一个模型中进行两个关联。地点:

团队 has_many 用户 现在,我想要那个团队 has_one Leader

这个“领导者”将是一个用户

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

Leader.rb

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

团队.rb

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

用户.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是一个用户,而不是一个领导/队长,你的方法需要current_user.(leader/captain).teams.create(team_params),还要检查你的关联,是领导还是队长 【参考方案1】:

在这种情况下,我认为你需要 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

【讨论】:

有了这个我不需要表“领导者”? 没错,你不再需要领导表了。 好的。我会测试。谢谢 @LuanD,感谢您的出色回答,但 leader_id 密钥属于哪里?在用户中?我不明白那条线。你能给我解释一下吗? @Vishal ,没有 leader_id 键属于 Team 表。【参考方案2】:

如何在名为leader 的用户表中设置boolean 标志。然后你的关联可以变成:

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

【讨论】:

但是理论上你不能拥有多个领导者吗?【参考方案3】:

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

这个“领导者”将是一个用户

使用继承(也称为子类化),Leader 是一个用户。

class User < ActiveRecord::Base
    belongs_to :team
end

class Leader < User
end

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

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

参考资料:

inheritance 特别是你需要'单表继承'

belongs_to 向下滚动查看 has_one 和 has_many,这里使用的三个关系。

【讨论】:

我认为这更好,因为它允许在未来只增加一列(类型)进行更多更改。有了接受的答案,leader_id 列仅适用于领导者...【参考方案4】:

current_user.teams.create(team_params)

Teams 用于 has_many 关联,您需要 current_user.create_team(team_params)

【讨论】:

您好...记录未保存在“船长”表中...谢谢【参考方案5】:

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

current_user.create_team(team_params)

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

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

【讨论】:

您好...记录没有保存在“船长”表中...谢谢 captains 表是什么?你没有在你的问题中具体说明这一点。顺便说一句,这个答案是否帮助您摆脱了原来的问题? 抱歉……队长错了……是队长。我已经编辑了我的问题。还没保存=(

以上是关于如何在同一模型中进行 has_many 和 has_one 关联?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 的belongs_to 和has_many 的同一个模型

Rails:如何通过 has_many 进行优雅的调用

使用 has_many 时如何创建关联模型的实例:通过关联

如何在父应用程序模型和挂载引擎模型之间设置has_many关联?

在“has_many :through”和“has_and_belongs_to_many”之间进行选择

与同一模型的多个关系