Как сделать has_many и has_one в одной модели?
Мне нужно сделать две ассоциации в одной модели. Где:
Команда has_many
Пользователь
Теперь я хочу, чтобы Команда has_one
Лидер
Этот "Лидер" будет Пользователем
Я пытаюсь использовать 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)
Ответы
Ответ 1
В этом случае я думаю, что вам нужна 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
Ответ 2
Команда has_many User Теперь я хочу, чтобы команда has_one Leader
Этот "Лидер" будет Пользователем
Использовать наследование (также называемое подклассификацией), Лидер - Пользователь.
class User < ActiveRecord::Base
belongs_to :team
end
class Leader < User
end
class Team < ActiveRecord::Base
has_many :users
has_one :leader
end
Также важна таблица ваших пользователей. Убедитесь, что пользователи имеют t.belongs_to :team
и t.string :type
в своем методе create_table. Обратите внимание, что Лидер является пользователем и ему не нужна отдельная таблица, однако вам нужно разрешить ActiveRecord записывать его тип, чтобы позднее он мог вернуть правильную модель.
Литература:
inheritance, в частности вам нужно "однонаправленное наследование таблицы"
принадлежит_to прокрутите вниз для has_one и has_many, трех используемых здесь связей.
Ответ 3
current_user.teams.create(team_params)
Команды для ассоциации has_many
, вы хотите current_user.create_team(team_params)
Ответ 4
Как установить флаг boolean
в таблице пользователей с именем leader
. И тогда ваша ассоциация может стать:
class Team < ActiveRecord::Base
has_many :users
has_one :leader, class_name: 'User', -> { where leader: true }
end
Ответ 5
У вас есть связь has_one
между user
и team
. Попробуйте следующее:
current_user.create_team(team_params)
Кроме того, вы должны добавить правильную обратную связь от team
до leader
.
class Team < ActiveRecord::Base
belongs_to :leader
has_one :user, through: :leader
end