2011-09-12 4 views
1

주어진 사용자에 대한 모든 게시물의 압축을 풉니 다. 내가 그 (것)들을 맞은 ㄴ다는 것을 확실하지 않다, 그래서 나는 잘 설명 할 것이다. 사용자는 일부 그룹에 소유권과 회원권을 가지고 있습니다. 사용자는 그룹의 회원 또는 소유자 일 수 있지만 둘 다일 수는 없습니다. 모든 게시물에는 사용자 및 그룹의 ID가 있습니다. 문제는 아래에 언급 된 관계 때문이라고 생각합니다. 어떻게 해결할 수 있습니까? 하나 더. 또한 다른 사용자가 사용자 그룹에 게시 한 모든 게시물을 찾아야합니다. 즉, 나는 그룹을 지나쳐야 만한다.Ruby on Rails 3에서 3 개의 테이블에 합치기

 /-- Owner ---\ 
User --    -- Group -- Post 
    | \-- Member --/    | 
    |_______________________________| 

class User < ActiveRecord::Base 
    has_many :posts, :dependent => :destroy 
    has_many :ownerships, :foreign_key => "user_id", :dependent => :destroy 
    has_many :memberships, :foreign_key => "user_id", :dependent => :destroy 

    # Problem with these two? I think so. 
    has_many :groups, :through => :memberships, :source => :user 
    has_many :groups, :through => :ownerships, :source => :user 

class Ownership < ActiveRecord::Base 
    belongs_to :users, :class_name => "User" 
    belongs_to :groups, :class_name => "Group" 
    has_many :posts, :through => :groups, :source => :posts 

class Membership < ActiveRecord::Base 
    belongs_to :users, :class_name => "User" 
    belongs_to :groups, :class_name => "Group" 
    has_many :posts, :through => :groups, :source => :posts 

class Group < ActiveRecord::Base 
    has_many :posts, :dependent => :destroy 

class Post < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :groups 

오류는 라인에서 오는 :

_groups = user.groups 

오류를 다음과 같이 모델 소유권의 사용자 :

소스 연결을 (를) 찾을 수 없습니다. 'has_many : groups, : through :> : 소유권, : source =>'을 시도하십시오. 사용자, 그룹 또는 게시 중 하나입니까?

+0

나는 (아직) 문제를 이해하지 못했습니다. 예상대로 작동하지 않는 것은 무엇입니까? – mkro

+0

@mkro 죄송합니다. 방금 끝에 추가 한 부분이 하나 빠졌습니다. 회원 자격 및 소유권을 통해 사용자에게 속한 그룹의 모든 게시물을 수집해야합니다. –

+0

@mkro 좀 더 자세히 설명 드리겠습니다. 이렇게하면 오류가 발생합니다. _groups = user.groups 모델 소유권의 소스 연결을 찾을 수 없습니다. 'has_many : groups, : through => : ownerships, : source =>'을 시도하십시오. 사용자, 그룹 또는 게시 중 하나입니까? –

답변

1

첫번째로 : 당신이 받고있어이 같은 MembershipOwnership 테이블의 연결을 정의했기 때문에 당신이보고있는 그 오류 :

belongs_to :users 

그들은 단지 하나의 사용자에 속하는해야 할 때 , 즉 단수 user :

belongs_to :user 

하지만 그럼에도 문제가 발생합니다.

Membership 모델과 Ownership 모델을 가지고 있으면 다음에 올라갈 것입니다. 예를 들어 owner이라는 memberships 테이블의 레코드 필드에서 수행 할 수있는 그룹 소유권을 나타내는 것 이외에 Ownership 모델을 사용하는 목적이 무엇인지 이해할 수 없습니다. 그것은 over-engineering입니다.

레일즈 코드의 문제점은 하나의 연결을 통해 많은 게시물을 가지고 있다는 것을 정의하는 것입니다. 그런 다음 다른 연결을 통해 많은 게시물을 가지고 있다고 말하고있는 것입니다. 결과적으로 다음을 수행합니다.

def posts 
    # find posts for the groups that I own 
end 

def posts 
    # find posts for the groups I belong to 
end 

두 개의 동일한 메소드가있는 것은 실수가 아닙니다. 이것은 정확히입니다. 두 개의 동일한 이름을 가진 연관을 정의하면됩니다.

이제 OwnershipMembership 모델을 가지고있는 것이 madness의 경로인지 알 수 있습니다.

그룹의 소유자를 선언하는 부울 속성이있는 Membership 모델을 사용하는 것이 좋습니다. 또한 원하는 경우 그룹의 새로운 소유자를 매우 쉽게 만들 수 있음을 의미합니다. 바로 부울을 뒤집습니다. 다른 레코드를 만들 필요가 없습니다.

Membership 하나를 모두 다룰 수있는 모델입니다.

+0

안녕하세요, 라이언! 나는 광기 링크를 좋아했다 :). 설명과 오류의 원인을 찾아 주셔서 감사합니다. 귀하의 조언을 고려하겠습니다. 일반적으로 분리의 초기 목적은 앞으로 별도의 테이블에 소유자와 회원의 속성을 유지하는 것이 었습니다. –