【问题标题】:Rails subquery always returns nil valueRails 子查询总是返回 nil 值
【发布时间】:2015-10-23 00:35:01
【问题描述】:

我需要在子选择中计算其他表的行数,所以我使用这个查询:

follows_sql = Follow.where(followable_type: 'Idea').where('follows.followable_id = ideas.id').select('COUNT(followable_id)').to_sql

idea = Idea.select("(#{follows_sql}) AS fcnt").includes(:collaborations).
  where(collaborations: { user_id: 4, owner: true })

所以它产生了有效的 SQL,但我无法从 idea var 访问 'fcnt' 值。我尝试以不同的方式做到这一点,例如:

idea[0].fcnt   # return nil
idea[0]["fcnt"]  # return nil

但我只能访问 Idea 模型中存在的字段。 如何访问我的自定义“fcnt”字段?

【问题讨论】:

  • idea[0].attributes 说什么?
  • 所有idea的属性列表,存在于数据库中
  • attributes 模型上的哈希包含对应结果集每一行的所有获取的字段。显然,选择在某个时候失败了。嗯……
  • 查看我的更新屏幕,您会看到 SQL 看起来不错
  • 嗯..也许您描述了您的表以及您要查询的内容?

标签: ruby-on-rails ruby postgresql


【解决方案1】:

我认为以下内容应该适合您

idea = Idea.select("ideas.*, COUNT(follows.id) AS fcnt").joins("LEFT OUTER JOIN follows ON follows.followable_id = ideas.id").group("ideas.id")

ideas.each do |idea|
  puts idea.fcnt
  # Should output a number
end

请注意,我省略了其他包含和 where 子句。尝试先解决问题,如果此查询成功,则添加您的附加子句。

另外,如果你正确设置了你的关系,这样一个想法有很多跟随,你可以通过做类似的事情来清理你的代码

ideas = Idea.includes(:collaborations).where(collaborations: { user_id: 4, owner: true })

ideas.map { |idea| idea.follows.count }

【讨论】:

  • 是的,includes 似乎把东西炸到了 SQL 地狱。但我们必须等待对问题的具体描述才能提出解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 2015-03-05
  • 2014-08-25
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多