【发布时间】:2016-02-27 23:34:00
【问题描述】:
我正在尝试使用 INNER JOIN、COUNT 和 GROUP BY 进行查询,以按标签数量对标签进行排序,并将计数作为结果的一部分。原始 sql 返回我分组的实际计数,而活动记录不是。
Tag.joins(:taggings).select('tags.id, tags.name, COUNT(taggings.note_id) as count').group('tags.id').order('count desc').to_a
返回
[#<Tag:0x007fa663be15e8 id: "d40dac2e-917b-4078-dfdf-47c1a6d43c72", name: "name1">,
#<Tag:0x007fa663be0918 id: "aa5d0f22-b6ad-46b0-sasa-0e2300ddc0fb", name: "name2">,
#<Tag:0x007fa663bead28 id: "7880318b-9bdc-48f5-a93c-b4b393f15d8b", name: "name3">,
#<Tag:0x007fa663beb228 id: "77c6ef97-f3ce-43be-vghf-45bb897fe4a7", name: "name4">,
...
但是,当我将此活动记录查询转换为原始 SQL 时,我得到了我真正想要的响应。
sql = Tag.joins(:taggings).select('tags.id, tags.name, COUNT(taggings.note_id) as count').group('tags.id').order('count desc').to_sql
ActiveRecord::Base.connection.execute(sql).to_a
返回
{"id"=>"d40dac2e-917b-4078-dfdf-47c1a6d43c72", "name"=>"name1", "count"=>"36"},
{"id"=>"aa5d0f22-b6ad-46b0-sasa-0e2300ddc0fb", "name"=>"name2", "count"=>"24"},
{"id"=>"7880318b-9bdc-48f5-a93c-b4b393f15d8b", "name"=>"name3", "count"=>"12"},
{"id"=>"77c6ef97-f3ce-43be-vghf-45bb897fe4a7", "name"=>"name4", "count"=>"10"},
...
我认为直接使用活动记录会更干净。有关如何改进此查询的任何建议?
谢谢。
【问题讨论】:
-
如果您在返回的实例上调用
#count,这是否有效,您是否获得了预期值?可能只是#inspect方法没有显示计数,因为它不是表格列。 -
尝试调用您的结果
first.count。你得到了什么? -
@OlegSobchuk 调用 first.count 确实给了我该行的计数。所以我想它在那里..只是不可见!有趣..
标签: sql ruby-on-rails activerecord