同じモデルで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)
この場合、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
boolean
というusersテーブルにleader
フラグを設定するのはどうですか。そして、あなたの協会は次のようになります。
class Team < ActiveRecord::Base
has_many :users
has_one :leader, class_name: 'User', -> { where leader: true }
end
チーム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 :team
とt.string :type
を持っていることを確認してください。リーダーはユーザーであり、個別のテーブルは必要ありませんが、後で正しいモデルを返すことができるように、ActiveRecordがそのタイプを記録できるようにする必要があることに注意してください。
参照:
継承 具体的には「単一テーブル継承」が必要です
belongs_to ここで使用されている3つの関係であるhas_oneとhas_manyを下にスクロールします。
あなたが持っている 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
current_user.teams.create(team_params)
チームは_has_many
_アソシエーション用であり、current_user.create_team(team_params)
が必要です