Как я могу заполнить таблицу соединений (многие-ко-многим) внутри seed.rb для ruby ​​on rails? - PullRequest
0 голосов
/ 15 ноября 2011

В настоящее время у меня есть модель для team.rb и user.rb, которая является отношением многих ко многим. Я создал таблицу соединений team_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 ]

1 голос
/ 24 января 2017

Выберите сторону для работы, а затем, как предлагает @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 как стандартные отношения 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 и user.teams.

1 голос
/ 15 ноября 2011

Это не оптимизировано, но

user.team_ids = user.team_ids < team.id
user.save

или, если это первая команда

user.team_ids = [team.id]
user.save

Также начните использовать has_many: through. тогда у вас будет модель TeamUser. это спасение жизни, если объединяющей таблице нужно больше атрибутов

0 голосов
/ 19 июня 2018

Используя 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>

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...