2014-06-21 66 views
0

我试过围绕如何浏览我想要的关联,但我似乎无法弄清楚。我试图得到Tag的所有Posts。每个帖子目前都有一个标题和正文文本,这两个文本都表示为TaggedText。每个TaggedText都可以有许多独特的标签 - 例如在Facebook帖子中标记多个人/页面(保存实例时在模型中实施唯一性)。Rails:跨多个协会提取模型

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

当您错误状态时,您需要将tag_ranges关联添加到您的Post模型。我还添加了一些可能会或可能不会有用的关联,并且会大大简化您的查询。不是你的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

奇妙的,完美的作品。谢谢乔!出于好奇,lambda在做什么:' - > {uniq}'?这只是对系统的“暗示”,或者是ActiveRecord实际执行某些事情?我从来没有见过lambda记录,你能找到一个链接到它的文档? – FeifanZ

+0

此外,在'标记'你添加关联'has_many:tag_ranges',显然获得'tagged_texts' ...为什么该关联获得'tagged_texts',而'has_many:tagged_texts,通过::tag_ranges'不? – FeifanZ

+1

我还没有找到' - > {}'的官方文档,这个文档叫做作用域块,但是你可以在[本Rails指南]中找到关于它的一些信息(http://guides.rubyonrails.org/ association_basics.html#范围换拥有多)。它本质上是为你的关联定义一个范围。在这种情况下,它意味着当获得这个帖子的标签时,只返回唯一的标签。 –