Rails / Active Record,按关联顺序/ has_many计数

时间:2015-08-15 13:07:42

标签: ruby-on-rails postgresql activerecord

我有一系列书籍,他们可以通过另一个表格关联许多主题。

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

没有运气。

1 个答案:

答案 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视频。