如何在seeds.rb中填充连接(多对多)表以获取ruby on rails?

时间:2011-11-15 03:44:20

标签: ruby-on-rails

我目前有一个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

3 个答案:

答案 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.membershipsteam.users;

在处理User模型时,您可以使用:user.membershipsuser.teams;

如果处理联接模型,您可以使用:membership.teammembership.user

如果你不使用它,你可以省略对连接模型的关系引用 - 特别是如果你像TeamUser之间的关系一样处理标准{{} 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具有多对多关系的表barsfoos_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>

希望这会有所帮助。