Добавить дополнительное поле в Rails habtm joins

107
10

У меня эти отношения между пользователями, командами

class CreateTeamsUsers < ActiveRecord::Migration
def change
create_table :teams_users, :id => false do |t|
t.references :user
t.references :team
t.timestamps
end
end
end
class User < ActiveRecord::Base
has_and_belongs_to_many :teams
end
class Team < ActiveRecord::Base
has_and_belongs_to_many :users
end

Проблема в том, что я хочу добавить дополнительный атрибут в HABTM, имя атрибута "user_name". Как это сделать?

спросил(а) 2015-01-28T16:54:00+03:00 5 лет, 8 месяцев назад
1
Решение
57

Вместо HABTM вы должны использовать has_many и has_many :through.

class User < ActiveRecord::Base
has_many :memberships
has_many :team, through: :membership
end

class Membership < ActiveRecord::Base # This would be your old 'join table', now a full model
belongs_to :user
belongs_to :team
end

class Team < ActiveRecord::Base
has_many :memberships
has_many :users, through: :memberships
end

ответил(а) 2015-01-28T17:35:00+03:00 5 лет, 8 месяцев назад
41

Короткий вариант, вы не можете делать то, что вы пытаетесь сделать без небольшого рефакторинга. Вот как я это сделаю (извинения, если есть проблемы с синтаксисом, я делаю это из памяти, я не тестировал код, но принцип звучит)

Создайте новую модель для представления "членства" команды (возможно, называйте ее "Членство") и связанной с ней миграции для создания таблицы:

class Membership
belongs_to :team
belongs_to :user
end

Затем измените модели своей команды и пользователя, чтобы использовать эту новую модель:

class User
has_many :memberships
has_many :teams, through: :memberships
end

class Team
has_many :memberships
has_many :users, through: :memberships
end

После того, как вы отредактировали это, добавление дополнительных столбцов/атрибутов в "членство" легко, потому что вы можете просто рассматривать его, как любую другую модель.

ответил(а) 2015-01-28T17:32:00+03:00 5 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема