2

私は次の構造を持っています:

class User < ActiveRecord::Base
end

class Item < ActiveRecord::Base
end

class Group < ActiveRecord::Base
end

AUserは、を作成(および所有)できますGroup
AGroupは、これらのアイテムにアクセスできるユーザーItemsのリストです。Usersつまり、ユーザーは、メンバーシップを通じてこれらのアイテムを表示できるリストを持っており、それらItemsを制御できます。UsersGroup

どのように関係を設定する必要がありますか?

4

1 に答える 1

5

さて、あなたはここで二重の多対多の関係を望んでいるという事実でいくつかの問題に遭遇するでしょう。つまり。グループには多くのアイテムがあり、それに属します。アイテムには多くのユーザーがあり、属します。

したがって、グループに多くのアイテムを含めることができ、アイテムが複数のグループに属している可能性があると仮定して、このように関係を設定します。

User has_many :groups
User has_and_belongs_to_many :items
User has_many :own_items, :class_name => 'Item'

Group belongs_to :user
Group has_and_belongs_to_many :items

Item has_and_belongs_to_many :groups
Item has_and_belongs_to_many :users
Item belongs_to :owner, :class_name => 'User'

移行は次のようになります。

# Group
:user_id, :integer

# Item
:owner_id, :integer

# GroupsItems
:group_id
:item_id

#ItemsUsers
:item_id
:user_id

さて、あなたが見ている構造は宇宙で最もきれいではありませんが、ユーザーの関連付けに注意している限り、期待どおりに動作します。

たとえば、ユーザーのアイテムを作成するには、次のようにします。

@user = User.first
@user.own_items.create(...)

アイテムを表示できるようにユーザーを割り当てるには...

@item = Item.find(...) #or @user.own_items.find(...)
@item.users = [user1,user2,user3]

これで、必要な関係が設定されますが、アクセスを制限する独自のコントローラー/ビューロジックを作成するか、CanCanなどのライブラリを使用する必要があります。

例えば:

# View
- if @item.users.include?(current_user)
  ...show item... 

# Items Controller:
def show
  @item = Item.find(params[:id])
  if @item.users.include?(current_user)
    ...continue...
  else
    redirect_to :back, :alert => 'You are not authorized to view this item.'
  end
end

それらの例があなたを正しい方向に向けてくれることを願っています。アクセス制御に関連して対処すべき多くの問題がありますが、それらを考えて、私が考えることができるそれぞれを解決しようとすることは、この質問の範囲を超えています。

また、これは私が考えることができる最も簡単なセットアップであることに注意してください。アソシエーションにさらに複雑なロジックがある場合は、本格的な結合モデルを作成し、HABTMの代わりにhas_many:throughアソシエーションを使用することをお勧めします。

幸運を!

于 2012-12-23T21:14:29.107 に答える