【问题标题】:Why is my Active Record Query returning different results than my raw SQL为什么我的 Active Record 查询返回的结果与我的原始 SQL 不同
【发布时间】: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


【解决方案1】:

事实证明,我通过活动记录获得了正确的结果。我可以在每个产生正确结果的实例上调用 #count,即使它在终端响应中并不明显。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2017-01-17
    • 2013-07-03
    相关资源
    最近更新 更多