我目前有一个team.rb和user.rb的模型,这是一个多对多的关系。我创建了join table teams_users但是我不确定如何在seed.rb中填充这个表?
例如,我有:
user = User.create({ first_name: 'Kamil', last_name: 'Bo', email: 'bo@gmail.com'})
team = Team.create([{ name: 'Spot Forwards', num_of_games: 10, day_of_play: 4}])
但以下不起作用???
TeamsUsers.create({ team_id: team.id, user_id: user.id })
我收到一条消息:
uninitialized constant TeamsUsers
答案 0 :(得分:1)
这不是优化的,但是
user.team_ids = user.team_ids < team.id
user.save
或者如果这是第一个团队
user.team_ids = [team.id]
user.save
也开始使用has_many:through。那么你将拥有一个TeamUser模型。如果连接表需要更多属性
,它可以节省生命答案 1 :(得分:1)
选择一个工作方,然后,正如@drhenner建议的那样,使用_ids
属性来创建关联。例如,使用User
模型,首先创建团队,然后创建用户,随时将他们分配给团队:
teams = Team.create([
{ name: 'Team 1' },
{ name: 'Team 2' },
{ name: 'Team 3' },
# etc.
])
User.create([
{ name: 'User 1', team_ids: [teams[0].id, teams[2].id] },
{ name: 'User 2', team_ids: [teams[1].id, teams[2].id] },
{ name: 'User 3', team_ids: [teams[0].id, teams[1].id] },
# etc.
])
以上评论:
您可以在has_many :through
关系上配置多个关系。由您决定要实施哪些。这些都是可能的:
class Team < ApplicationRecord
has_many :memberships
has_many :users, through: :memberships
end
class Membership < ApplicationRecord
belongs_to :team
belongs_to :user
end
class User < ApplicationRecord
has_many :memberships
has_many :teams, through: :memberships
end
因此,在处理Team
模型时,您可以使用:team.memberships
和team.users
;
在处理User
模型时,您可以使用:user.memberships
和user.teams
;
如果处理联接模型,您可以使用:membership.team
和membership.user
。
如果你不使用它,你可以省略对连接模型的关系引用 - 特别是如果你像Team
和User
之间的关系一样处理标准{{} 1}}关系:
has_and_belongs_to_many
这会为您提供class Team < ApplicationRecord
has_many :users, through: :memberships
end
class User < ApplicationRecord
has_many :teams, through: :memberships
end
和team.users
。
答案 2 :(得分:0)
使用Rails,假设您使用表foos
具有多对多关系的表bars
和foos_bars
,您可以像这样播种它们的关联:
bar1 = Bar.find(1)
bar2 = Bar.find(2)
foo1 = Foo.find(1) # for example
foo1.bars << bar1
foo1.bars << bar2
foo1.save
这将使用关联foos_bars
,<foo_id:1, bar_id:1>
来更新联接表<foo_id:1, bar_id:2>
希望这会有所帮助。