2014-06-21 1 views
0

내가 원하는 연관을 탐색하는 방법에 대한 내 마음을 감싸려고했지만 그걸 알아낼 수 없습니다. 나는 Tag이 주어진 Posts을 얻으려고 노력하고 있습니다. 각 게시물에는 현재 제목과 본문이 있으며 두 가지 모두 TaggedText으로 표시됩니다. 각 TaggedText에는 Facebook 고유 게시물 (인스턴스 저장시 모델에서 고유성이 적용됨)에서 여러 사람/페이지에 태그를 지정하는 것과 같이 많은 고유 태그가있을 수 있습니다.레일스 : 여러 연관에 걸쳐 모델 가져 오기

class Tag < ActiveRecord::Base 
    has_many :tagged_texts, through: :tag_ranges 
end 
class Post < ActiveRecord::Base 
    has_many :tagged_texts 
end 
class TaggedText < ActiveRecord::Base 
    # Each TaggedText cannot have more than one of each tag 
    has_many :tags, through: :tag_ranges 
    belongs_to :post 
end 
class TagRange < ActiveRecord::Base 
    # TaggedText cannot have more than one of each tag 
    belongs_to :tagged_text 
    belongs_to :tag 
end 

나는 테이블을 조인했지만, 나는 오류 Association named 'tag_ranges' was not found on Post 얻을 : 나는 작업 쿼리를 얻을 실종 무엇

def get_posts_by_tag(tag, page, posts_per_page) 
Post 
    .joins(:tagged_texts) 
    .joins(:tag_ranges) 
    .joins(:tags) 
    .where('tag.id = ?', tag.id) 
    .uniq 
    .limit(posts_per_page) 
    .offset(page - 1) 
    .to_a 
end 

을 - 또는 어떻게 든 내 모델과 연관성을 구조 조정해야합니까?

답변

1

상태가 잘못되었으므로 Post 모델에 tag_ranges 연관을 추가해야합니다. 또한 유용하거나 유용하지 않을 수도있는 몇 가지 연관성을 추가했으며, 쿼리를 크게 단순화 할 수도 있습니다. 귀하의 TagRange 클래스의 연관성은 그대로입니다.

class Tag < ActiveRecord::Base 
    has_many :tag_ranges # need this association in order to get tagged_texts 
    has_many :tagged_texts, through: :tag_ranges 
    has_many :posts, -> { uniq }, through: :tagged_texts # posts with the given tag 
end 

class Post < ActiveRecord::Base 
    has_many :tagged_texts 
    has_many :tag_ranges, through: :tagged_texts # Post now has association named 'tagged_ranges' 
    has_many :tags, -> { uniq }, through: :tag_ranges # tags that given post has 
end 

class TaggedText < ActiveRecord::Base 
    has_many :tag_ranges # all tag ranges for a tag text 
    has_many :tags, through: :tag_range 
    belongs_to :post 
end 

그리고 지금, 당신의 쿼리는 태그에 대한 모든 게시물을 얻을 수 있습니다 :

def get_posts_by_tag(tag, page, posts_per_page) 
    tag.posts.limit(posts_per_page).offset(page - 1).to_a 
end 

는 희망이 도움이!

+0

환상적이며 완벽하게 작동합니다. 고마워, 조! 호기심에서, 람다는 무엇을하고 있는가 :'-> {uniq}'? 그냥 시스템에 대한 힌트 일까, 아니면 ActiveRecord가 실제로 어떤 것을 강제하는 것입니까? lambda가 문서화 된 것을 본 적이 없습니다. 문서에 대한 링크를 찾을 수 있습니까? – FeifanZ

+0

또한,'Tag'에 다음과 같이'has_many : tag_ranges' 연관을 추가합니다. 이것은 분명히'tagged_texts'를 가져옵니다 ... 왜 has_many : tagged_texts, through : : tag_ranges는 그렇지 않지만 그 연관은'tagged_texts'입니까? – FeifanZ

+1

스코프 블록이라고 불리는'-> {}'의 공식 문서를 찾을 수 없었지만, [this Rails Guide] (http://guides.rubyonrails.org/)에서 이에 대한 정보를 찾을 수 있습니다. association_basics.html # scope-for-has-many). 그것은 본질적으로 당신을위한 범위를 정의하고 있습니다. 이 경우이 게시물의 태그를 가져올 때 고유 한 태그 만 반환한다는 의미입니다. –

관련 문제