【问题标题】:Using Rails/AR to generate this complex query使用 Rails/AR 生成这个复杂的查询
【发布时间】:2011-04-04 20:12:16
【问题描述】:

在尝试解决分组和排序问题(此处的原始问题:"Complex" grouping and indexing in rails?)时,我得到了一个 SQL 查询,它将以正确的方式获取正确的记录。

我现在的问题是:如何使用 Rails/AR 合成器生成这个 SQL 查询?

SQL查询如下:

SELECT
u.id as owner_id, u.name as owner_name, t.id, t.due_date
FROM users u
INNER JOIN tasks m ON u.id = m.owner_id
INNER JOIN tasks t ON u.id = t.owner_id
GROUP BY u.id, u.name, t.id, t.due_date
ORDER BY MIN(m.due_date), t.due_date

【问题讨论】:

  • INNER JOIN tasks m ON u.id = m.owner_id INNER JOIN tasks t ON u.id = t.owner_id - 这不可能,它应该怎么做?
  • 归结为我想根据子类的属性对父类进行排序。此查询尝试采用不同的方法对子类进行分组(按父类)和排序(按属性)。无论哪种方式都会帮助我。
  • 你的评论促使我在这里改写问题link
  • @Jonas:查看原始问题,这是一种按用户任务的最小到期日期排序记录的方法。

标签: ruby-on-rails ruby-on-rails-3 orm activerecord


【解决方案1】:

我认为你需要使用你的数据库和这些属性来让它恰到好处,但你可以尝试这样的事情。

class User < ActiveRecord::Base
   has_one :next_task, :class_name => :task, :order => "due_date desc", :limit => 1
   has_many :tasks, :order => "due_date desc"

end

class Task < ActiveRecord::Base
    belongs_to :user

end

User.include([:next_task,:tasks]).order("task.due_date desc").tasks.each { |task|
      puts task.user.owner_id 
      puts task.user.owner_name
      puts task.due_date
}

我不确定用于对用户进行排序的 order 子句...您必须检查生成的 SQL 以确定确切需要在那里的内容。

【讨论】:

  • include 不会生成INNER JOIN,它会生成LEFT JOIN。请改用joins。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 2018-06-23
  • 2014-07-15
相关资源
最近更新 更多