Rails 订购范围 counter_cache

Rails scope to order by counter_cache

我正在尝试为评论最多的用户显示“前 10 名”。

评论有belongs_to :user, counter_cache: :comments_count.

用户有:

def self.top_by_comment_count
  order('comments_count desc').limit(10).to_a
end

这在我的本地机器上运行良好,但在 Heroku 部署中,我让所有用户在顶部没有没有评论。

我认为这将是一个相对简单的任务,但我正在努力反对它。

感谢您的帮助!

您可能在 comments_count 列中有 NULL。

最好的办法是根本不要有 NULL,稍微迁移一下就可以解决这个问题:

change_column_default :users, :comments_count, 0
change_column_null :users, :comments_count, false

或者,您可以告诉 PostgreSQL 您想要 NULL 的位置:

order('comments_count desc nulls last')

但实际上,只需更改列的空值和默认值即可完全避免 SQL NULL。

可能的问题是 PostgreSQL 命令 NULL 与您预期的不同

comments_countnil 的用户在此列表的顶部

如何解决。您可以在 Herokurails 控制台中 运行

User.where(comments_count: nil).find_each { |user| User.reset_counters(user.id, :comments) }

此命令会将 NULL 重置为 0

我还建议添加新迁移,默认 0comments_count

像这样

change_column :users, :comments_count, :integer, default: 0, null: false