【问题标题】:Activerecord SQL query outputActiverecord SQL 查询输出
【发布时间】:2013-10-16 22:27:55
【问题描述】:

我在 Rails 中有一个相当长的 SQL 查询:

Region.includes(:answers, answers: :choice)
      .where('choices.id IS NULL OR choices.id = ?', 28)
      .where('answers.id IS NULL OR answers.question_id = ?', 14)
      .group("regions.region","choices.choice").count("answers")

这给了我所有区域的哈希,包括选择名称和答案计数,即使计数为零。这是输出:

{["East", nil]=>0, ["East Midlands", nil]=>0, ["London", nil]=>0, ["North East", nil]=>0, ["North West", nil]=>0, ["Northern Ireland", nil]=>0, ["Rest of World", "No"]=>3, ["Scotland", nil]=>0, ["South East", nil]=>0, ["South West", nil]=>0, ["Wales", nil]=>0, ["West Midlands", nil]=>0, ["Yorkshire and the Humber", nil]=>0} 

目前唯一有答案的地区是“世界其他地区”,其中显示选项名称“否”。

所有其他项目都显示“nil”作为选项名称 (choices.choice)。如何更改查询以输出选择名称“否”而不是 nil,即使没有与之关联的答案?

谢谢

【问题讨论】:

  • 通过向数据库添加默认值?
  • 到哪个型号?我不确定这是否可行。查询正在计算答案。每个答案在创建时都由 region_id 分配一个给定的区域。我在创建问题时已经有一个默认的“投票”值,但这不是按地区划分的。
  • 啊好的,所以没有设置关系。不是说数据库中有NULL作为choice.choice的值吗?
  • 是的,没错。我需要查询中的“IS NULL”部分,以便显示所有区域和选择,无论计数为零。
  • 我认为您必须像答案中描述的那样以编程方式执行此操作。

标签: sql ruby-on-rails postgresql activerecord


【解决方案1】:

这很简单 - 使用 Postgres COALESCE(),它的工作方式是您提供任意数量的参数,并返回第一个产生非 NULL 值的参数。

试试这个:

Region.includes(:answers, answers: :choice)
      .where('choices.id IS NULL OR choices.id = ?', 28)
      .where('answers.id IS NULL OR answers.question_id = ?', 14)
      .group("regions.region","COALESCE(choices.choice, 'No')").count("answers")

【讨论】:

  • 这很好并且有效,是否可以像'@choices.choice'那样传递实例变量而不是字符串'No'?
  • 忽略该评论。我通过“#{choices.first.choice}”实现了它。将标记为已接受。谢谢
  • 不确定你到底想通过什么。这个@choices 来自哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多