Rails3通过问题嵌套has_many

时间:2010-09-05 03:53:20

标签: ruby-on-rails-3 has-many-through

我们计划将我们的应用程序升级到Rails3。我们使用过的一个插件是nested_has_many_through。这个插件似乎过时了,不再维护,并且似乎没有在新的Rails3应用程序中工作。

一个简单的例子:

Author.rb
has_many :posts
has_many :categories, :through => :posts, :uniq => true
has_many :related_posts, :through => :categories

Post.rb
belongs_to :author
belongs_to :category

Category.rb
has_many :posts

任何人都可以推荐最佳实践方法来处理这个问题,或者使用Rails3插件吗?

谢谢!

3 个答案:

答案 0 :(得分:7)

答案 1 :(得分:0)

我对has_many:related_posts部分感到困惑。您是否尝试将分类帖子基本联合起来?比如,“x”类别中的所有帖子都被视为“相关”?如果是这样,基于没有RelatedPost类,这将无法工作,因此要在最低限度上修复此问题,您必须在关联上指定:class_name:

has_many :related_posts, :class_name => 'Post', :through => :categories

但其次,这可能不是开始的正确方法。由于任何作者都已经通过author_id外键发布了很多帖子,因此尝试编织类别表没有任何意义,而是使用分组逻辑。

清理它的替代方法:

Author.rb

has_many :posts do
  def related
    all.group_by(&:category_id)
  end
end
author.posts.related
=> OrderedHash

当然,如果不是你想要完成的事情,所有这一切都没有实际意义。 :P

答案 2 :(得分:0)

Rails 3(未经测试,按大多数相关类别的帖子排序):

category.rb:

class Category < ActiveRecord::Base
  class << self
    def posts
      Post.joins(:categories).
           where(:categories => select('id').all.map(&:id)).
           group('posts.id').
           order('count(*) DESC')
    end
  end
end

用法:

related_posts = author.categories.posts