Подтвердить что ты не робот

Как сделать 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)
4b9b3361

Ответ 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