Ruby on rails 按活动记录中的频率排序结果
我不熟悉Rails和活动记录查询。我想按频率对查询结果排序 作为SQL查询,它可以是:Ruby on rails 按活动记录中的频率排序结果,ruby-on-rails,ruby,rails-activerecord,Ruby On Rails,Ruby,Rails Activerecord,我不熟悉Rails和活动记录查询。我想按频率对查询结果排序 作为SQL查询,它可以是: SELECT author FROM books GROUP BY author ORDER BY COUNT(*) DESC LIMIT 10; (我发现了这一点,这对构建这个问题非常有帮助。) 我现在所拥有的将按字母顺序进行: <p>The authors are: <% @books.select(:author).distinct.order(:author).each do |b
SELECT author FROM books GROUP BY author ORDER BY COUNT(*) DESC LIMIT 10;
(我发现了这一点,这对构建这个问题非常有帮助。)
我现在所拥有的将按字母顺序进行:
<p>The authors are: <% @books.select(:author).distinct.order(:author).each do |book| %>
<br><%= book.author %> <%= @books.where(author: book.author).count %>
<% end %></p>
作者是:
这会让我感到惊讶,例如:
艾萨克2号,阿西莫夫
迪克,菲利普K.8
品钦,托马斯3
等等。
但我想按频率(迪克、品钦、阿西莫夫)排序结果,而不是按字母顺序
如果可能的话,我想将作者姓名和图书数量作为单独的输出(希望能够将其切换到一个表),尽管我确信有更好的方法可以获得输出中的频率(而不是@books.where(author:book.author).count
)。但主要问题是如何正确地进行初始订购
非常感谢您的帮助。试试这个
Book.group("author").order("count_author desc").count("author")
所以你的观点看起来像
<% @books.group("author").order("count_author desc").count("author").each do |author, count| %>
<br><%= author %> <%= count %>
<% end %></p>
试试这个
Book.group("author").order("count_author desc").count("author")
所以你的观点看起来像
<% @books.group("author").order("count_author desc").count("author").each do |author, count| %>
<br><%= author %> <%= count %>
<% end %></p>
使用下面的示例查询和生成的sql
Task.group(:project_id).limit(10).count(:id)
SELECT COUNT(`tasks`.`id`) AS count_id, project_id AS project_id FROM `tasks` GROUP BY project_id LIMIT 10
Output: {18=>1206, 22=>82, 23=>25, 25=>77, 29=>1, 35=>1, 42=>30, 44=>1, 45=>17, 53=>12}
您可以看到,按照惯例,rails使用count\uu
进行计数。您可以使用此约定按该计数排序
Task.group(:project_id).limit(10).order('count_id DESC').count(:id)
SELECT COUNT(`tasks`.`id`) AS count_id, project_id AS project_id FROM `tasks` GROUP BY project_id ORDER BY count_id DESC LIMIT 10
Output: {145=>1949, 105=>1535, 18=>1206, 141=>738, 23804=>667, 9892=>524, 196=>478, 26969=>338, 24119=>330, 28047=>300}
更好的方法是在控制器中准备变量并在视图中访问它们
# controller
@counts = Book.group(:author).order('count_id DESC').count(:id)
# view
<% @counts.each do |author, count| %>
<%= author %> <%= count %>
<% end %>
#控制器
@counts=Book.group(:author.order('count\u id DESC')。count(:id)
#看法
上面的
@counts
包含一个散列,其中键是作者,值是作者对书籍的计数。使用下面的示例查询和生成的sql
Task.group(:project_id).limit(10).count(:id)
SELECT COUNT(`tasks`.`id`) AS count_id, project_id AS project_id FROM `tasks` GROUP BY project_id LIMIT 10
Output: {18=>1206, 22=>82, 23=>25, 25=>77, 29=>1, 35=>1, 42=>30, 44=>1, 45=>17, 53=>12}
您可以看到,按照惯例,rails使用count\uu
进行计数。您可以使用此约定按该计数排序
Task.group(:project_id).limit(10).order('count_id DESC').count(:id)
SELECT COUNT(`tasks`.`id`) AS count_id, project_id AS project_id FROM `tasks` GROUP BY project_id ORDER BY count_id DESC LIMIT 10
Output: {145=>1949, 105=>1535, 18=>1206, 141=>738, 23804=>667, 9892=>524, 196=>478, 26969=>338, 24119=>330, 28047=>300}
更好的方法是在控制器中准备变量并在视图中访问它们
# controller
@counts = Book.group(:author).order('count_id DESC').count(:id)
# view
<% @counts.each do |author, count| %>
<%= author %> <%= count %>
<% end %>
#控制器
@counts=Book.group(:author.order('count\u id DESC')。count(:id)
#看法
上面的
@counts
包含一个散列,其中键是作者,值是该作者的书籍计数。仅供参考:查询应在控制器中仅供参考:查询应在控制器中