共同執筆プラットフォームをセットアップしています。ユーザーは、任意のアイテムが任意のセットに含まれ、任意のユーザーに属することができるアイテムのセットを持つことができます。ただし、これによりいくつかの問題が発生します。
これらは私のモデル関係です:
class Association < ActiveRecord::Base
belongs_to :user
belongs_to :set
belongs_to :item
end
class Set < ActiveRecord::Base
has_many :associations
has_many :users, through: :associations
has_many :items, through: :associations
end
class Item < ActiveRecord::Base
has_many :associations
has_many :users, through: :associations
has_many :sets, through: :associations
end
これを正しく処理する「レールの方法」がわかりません。
問題 1:
新しいアイテムを作成する場合、セット/アイテムの関連付けのみが保存され、ユーザーは保存されません。
class ItemsController < ApplicationController
def create
@set = current_user.sets.find(params[:set_id])
@set.where(title: params[:item][:title]).first_or_create!
end
end
*更新*
問題 1 を修正するために、私が把握できる最善の方法は、次のことを行うことでした。
@set = current_user.sets.find(params[:set_id])
@item = Item.where(name: params[:item][:title]).first_or_create!
Association.where(item_id: @item.id, set_id: @set.id, user_id: current_user.id).first_or_create!
しかし、非常に間違っているように感じます!
問題 2:
アソシエーション テーブルが問題 1 から正しく設定されていると仮定すると、次のコントローラーは、セットが所有するすべてのアイテムを返しますが、ユーザーの所有権は無視します。
class SetsController < ApplicationController
def index
@sets = current_user.sets.includes(:items)
end
end
*更新*
これに関する答えを見つけることはまだ運がありません。問題をもう少し詳しく説明するには:
以下は、現在のユーザーに属するセットのみを返します
@sets = current_user.sets.all
ただし、以下はユーザーのセットのみを返しますが、現在のユーザーに属していなくても、セットのすべてのアイテムが含まれます。つまり、ユーザー スコープは削除されます。
@sets = current_user.sets.includes(:items)
私は一日中これを解決しようとしてきましたが、リードを見つけることができないようです