2012-12-23 14 views
2

나는 다음과 같은 구조를 가지고있다.
GroupItems의 목록이며이 항목에 액세스 할 수있는 Users의 목록입니다. 즉, 사용자는 Items의 목록을 가지고 있으며 Group 회원을 통해이 항목을 볼 수있는 Users을 제어 할 수 있습니다.레일 모델 관계가 많고 많은 것이 있습니까? <code>User</code>가 <code>Group</code>를 작성 (함으로써 자신의) 수</p> <pre><code>class User < ActiveRecord::Base end class Item < ActiveRecord::Base end class Group < ActiveRecord::Base end </code></pre> <p>:

관계를 어떻게 설정해야합니까?

답변

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 

지금, 당신이보고있는 구조는 우주에서 가장 깨끗한 아니라, 당신이 아니라 당신이 사용자 협회에주의 것으로 예상대로 동작합니다. 이제

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

, 이것은 당신이 원하는 관계를 설정 ...

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

항목을 볼 수 등 사용자를 할당하는 것이 아니라 : 예를 들어

는 사용자의 항목을 만들 수 있습니다 자신의 컨트롤러/뷰 로직을 작성하여 액세스를 제한하거나 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 :를 사용할 수 있습니다.

행운을 빈다.

관련 문제