我有一系列书籍,他们可以通过另一个表格关联许多主题。
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 :(得分: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
迁移它,如果您有现有记录,则更新计数器val,并从那里按照他们拥有的书籍数量对主题进行排序应该很容易。
我意识到你想要一个查询来解决这个问题,但根据我的经验,这应该会快得多。
如果有错误,请嘲笑。计数器名称不是最好的,但在文档中有一个例子如何更改它。如果还不够,还有一个railscast视频。