我有一些书,他们可以通过另一个表格关联许多主题。
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
没有运气。
认为执行此操作的正确方法是实现计数器缓存
在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
迁移它,如果您有现有记录,请更新counter val,从那里可以轻松按主题的书数对主题进行排序。
我意识到您想通过查询来解决此问题,但是根据我的经验,这应该更快。
如有错误,请耐心等待。计数器名称不是最好的,但是在文档中有一个示例如何更改它。如果还不够的话,还有一个railscast vid。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句