ActiveRecord兄弟姐妹在多对多的关系中

时间:2010-08-04 12:35:24

标签: ruby-on-rails ruby activerecord many-to-many siblings

我在一定程度上有这个工作,但我正在寻找一些关于如何在一对多关系中查询兄弟姐妹的输入,看看是否有更优雅的方法来实现这一点。

考虑以下课程

class Post < ActiveRecord::Base
  has_many :post_categories
  has_many :categories, :through => :post_categories
end


class Category < ActiveRecord::Base
  has_many :post_categories
  has_many :posts, :through => :post_categories
end

根据定义,帖子可以有多个类别,我需要的是在网站上显示“相关帖子”区域。就像我之前提到的,我确实有一个工作版本,只需执行以下操作:

Post.find(id, :include => {:categories => :posts})

查看日志,应用程序必须执行五个查询以获取我要查找的最终数据。

任何想法都表示赞赏!

2 个答案:

答案 0 :(得分:3)

我看到你遇到的唯一问题是你可能不希望返回所有与帖子共享类别的帖子。

@post = Post.find params[:id]
@related_posts = Posts.find(:all, :joins => :post_categories,
                              :select => "posts.*, count(post_categories) post_category_count", 
                              :conditions => {:post_categories => {:category => @post.categories}}, 
                              :group => "posts.id", :order => "post_category_count desc")

这将首先返回最相关的帖子,即。具有最多共享类别的那些,您可以添加限制或分页以限制返回的结果。

答案 1 :(得分:0)

如果您需要支持大型对象树,您可能需要查看awesome nested set,认为这个问题可能有点过分。