【问题标题】:Hand writing a SQL query with a has_many relationship用 has_many 关系手工编写 SQL 查询
【发布时间】:2014-04-03 14:03:39
【问题描述】:

由于我无法控制的原因,我需要在 MySQL 中手动编写 SQL 查询。

我的模型是:

class Survey < ActiveRecord::Base
  has_many :buildings
  has_many :floors, through: :buildings
  has_many :workspaces, through: :floors
end

class Workspace < ActiveRecord::Base
  belongs_to :floor
end

class Floor < ActiveRecord::Base
  has_many :workspaces
end

我需要根据它有多少工作空间来订购我的调查。

在 Rails 代码中,我可以执行以下操作:@survey.workspaces.size,这将获得@survey 拥有的工作区数量。

鉴于此 SQL 查询:

SELECT `surveys`.* 
FROM `surveys` 
ORDER BY surveys.workspaces.size asc 
LIMIT 10 
OFFSET 0

如何手动编写根据工作空间数量排序的查询?

【问题讨论】:

  • 我会在这里使用命名范围...
  • 我也会,但由于设计限制,我确实需要手工制作此查询。

标签: mysql sql ruby-on-rails activerecord


【解决方案1】:

为模型添加范围。找到导致所需答案的 AR。将to_sql 添加到该ActiveRecord 以获取所需的SQL 代码。

【讨论】:

    【解决方案2】:

    我不确定您想将 SQL 与 Rails 混合使用,还是单独使用 SQL。纯 SQL 将是:

    SELECT s.id, count(w.id) AS workspaces_count
    FROM surveys s LEFT JOIN workspaces w ON s.id = w.survey_id
    GROUP BY s.id
    ORDER BY 2
    

    如果您想从调查中添加其他列,那么您还需要将它们添加到 GROUP BY。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多