【问题标题】:How to do has_many and has_one association in same model?如何在同一模型中进行 has_many 和 has_one 关联?
【发布时间】: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),还要检查你的关联,是领导还是队长

标签: ruby-on-rails ruby-on-rails-4 associations


【解决方案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 表是什么?你没有在你的问题中具体说明这一点。顺便说一句,这个答案是否帮助您摆脱了原来的问题?
  • 抱歉……队长错了……是队长。我已经编辑了我的问题。还没保存=(
猜你喜欢
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多