1

共同執筆プラットフォームをセットアップしています。ユーザーは、任意のアイテムが任意のセットに含まれ、任意のユーザーに属することができるアイテムのセットを持つことができます。ただし、これによりいくつかの問題が発生します。

これらは私のモデル関係です:

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)

私は一日中これを解決しようとしてきましたが、リードを見つけることができないようです

4

2 に答える 2

2

最初の問題は、インスタンス変数が同じであることを確認することです。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    
于 2012-09-26T20:18:26.450 に答える
2

これはあなたが意味するものですか?ユーザーは多くのアイテムを持つことができます。ユーザーは多くのセットを持つことができます。

アイテムは複数のユーザーに属することができます。アイテムは複数のセットに属することができます。

その場合は、複数の結合モデルが必要です。

Class UserItemAssociation < ActiveRecord::Base
  belongs_to :user
  belongs_to :item
end

Class SetItemAssociation < ActiveRecord::Base
  belongs_to :set
  belongs_to :item
end

Class Item < ActiveRecord::Base
  has_many :user_item_associations
  has_many :users, through: :user_item_associations

  has_many :set_item_associations
  has_many :sets, through :set_item_associations
end

Class Set < ActiveRecord::Base
  belongs_to :user
end

コントローラーで:

@set = current_user.sets.find_or_create_by(params[:set_id])
@item = @set.items.where(title: params[:item][:title]).first_or_create!
current_user.items << @item

ただし、ここでは別の見方をします。

ユーザー モデルで、このメソッドを追加します。

  def items
    self.sets.collect{|set| set.items}.flatten
  end

この方法では、Association モデルだけでユーザーをセットに参加させることができますが、user.items には引き続きアクセスできます。

于 2012-09-26T20:34:40.440 に答える