web-dev-qa-db-ja.com

同じモデルでhas_manyとhas_oneの関連付けを行う方法は?

同じモデルで2つの関連付けを行う必要があります。どこ:

チーム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)
27
Igor Martins

この場合、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
24
Luan D

booleanというusersテーブルにleaderフラグを設定するのはどうですか。そして、あなたの協会は次のようになります。

class Team < ActiveRecord::Base   
  has_many :users   
  has_one :leader, class_name: 'User', -> { where leader: true }
end
3
usmanali

チームhas_manyユーザー今、私はそのチームhas_oneリーダーが欲しい

この「リーダー」はユーザーになります

継承(サブクラス化とも呼ばれます)を使用します。リーダーはユーザーです。

class User < ActiveRecord::Base
    belongs_to :team
end

class Leader < User
end

class Team < ActiveRecord::Base
    has_many :users
    has_one :leader
end

ユーザーテーブルも重要です。ユーザーがcreate_tableメソッドにt.belongs_to :teamt.string :typeを持っていることを確認してください。リーダーはユーザーであり、個別のテーブルは必要ありませんが、後で正しいモデルを返すことができるように、ActiveRecordがそのタイプを記録できるようにする必要があることに注意してください。

参照:

継承 具体的には「単一テーブル継承」が必要です

belongs_to ここで使用されている3つの関係であるhas_oneとhas_manyを下にスクロールします。

3
Matt Stevens

あなたが持っている has_oneuserteamの間の関連付け。これを試して:

current_user.create_team(team_params)

また、teamからleaderに適切なバックアソシエーションを追加する必要があります。

class Team < ActiveRecord::Base
  belongs_to :leader
  has_one :user, through: :leader
end
1
RAJ

current_user.teams.create(team_params)

チームは_has_many_アソシエーション用であり、current_user.create_team(team_params)が必要です

1
j-dexx