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_count
为 nil
的用户在此列表的顶部
如何解决。您可以在 Herokurails 控制台中 运行
User.where(comments_count: nil).find_each { |user| User.reset_counters(user.id, :comments) }
此命令会将 NULL
重置为 0
我还建议添加新迁移,默认 0
为 comments_count
像这样
change_column :users, :comments_count, :integer, default: 0, null: false
我正在尝试为评论最多的用户显示“前 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_count
为 nil
的用户在此列表的顶部
如何解决。您可以在 Herokurails 控制台中 运行
User.where(comments_count: nil).find_each { |user| User.reset_counters(user.id, :comments) }
此命令会将 NULL
重置为 0
我还建议添加新迁移,默认 0
为 comments_count
像这样
change_column :users, :comments_count, :integer, default: 0, null: false