2015-08-15 92 views
0

我有一个书籍集合,他们可以通过另一个表关联很多主题。Rails/Active Record,通过关联排序/ has_many计数

class Book < ActiveRecord::Base 
    has_many :book_topics, dependent: :destroy 
    has_many :topics, through: :book_topics 
end 

然后,我有一个助手,列出所有的话题,但我想列出主题,通过具有该主题图书的数量进行排序。

我试过的变化:

def topic_list 
    Topic.joins(:book_topics) 
     .group("book_topics.topic_id") 
     .order("count(book_topics.book_id) desc") 
end 

没有运气。

+0

'book_topics.video_id'?该字段是否在'book_topics'表中?我希望看到'topic_id'。也许这就是问题所在? –

+0

是的,抱歉,这意味着要topic_id,而不是video_id - 不是问题,只是代表我输入错误。 –

+0

然后解决你的问题。这对我来说似乎是合法的,问题到底是什么? –

回答

0

认为,要做到这一点适当的方式将实现counter cache

在book_topic.rb你会

class BookTopic < ActiveRecord::Base 
    belongs_to :topic, counter_cache: true 
end 

topic.rb应保持不变

class Topic < ActiveRecord::Base 
    has_many :book_topics, dependent: :destroy 
end 

然而,您必须将计数器列添加到主题表

class AddBookTopicsCountToTopics < ActiveRecord::Migration 
    def change 
    add_column :topics, :book_topics_count, :integer, default: 0 
    end 
end 

迁移它,如果您有现有记录,请更新计数器值,并且从那里可以很容易地按主题书籍数排序。

我意识到你想要一个查询来解决这个问题,但根据我的经验,这应该快得多。

sry如果有错误。计数器名称并不是最好的,但文档中有一个示例说明如何更改它。如果这还不够,还有一个railscast视频。

+0

谢谢,counter_cache像一个魅力一样工作。 –