如何在同一模型中进行 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)
您在 user
和 team
之间有 has_one
关联。试试这个:
current_user.create_team(team_params)
此外,您应该添加从 team
到 leader
的适当反向关联。
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 :team
和 t.string :type
。请注意,Leader 是一个 User,不需要单独的 table,但是您需要允许 ActiveRecord 记录其类型,以便稍后可以 return 正确的模型。
参考文献:
inheritance 具体来说你需要 'single table inheritance'
belongs_to 向下滚动 has_one 和 has_many,此处使用的三个关系。
我需要在同一个模型中做两个关联。其中:
团队 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)
您在 user
和 team
之间有 has_one
关联。试试这个:
current_user.create_team(team_params)
此外,您应该添加从 team
到 leader
的适当反向关联。
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 :team
和 t.string :type
。请注意,Leader 是一个 User,不需要单独的 table,但是您需要允许 ActiveRecord 记录其类型,以便稍后可以 return 正确的模型。
参考文献:
inheritance 具体来说你需要 'single table inheritance'
belongs_to 向下滚动 has_one 和 has_many,此处使用的三个关系。