Ruby on rails 如何根据子类的属性对父类进行排序?
在我看来,我有一个简单的要求:我想根据父类的子类的属性对其进行排序Ruby on rails 如何根据子类的属性对父类进行排序?,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,在我看来,我有一个简单的要求:我想根据父类的子类的属性对其进行排序 class owner has_many :tasks end class task belongs_to :owner end 现在,我想根据任务的到期日对所有者进行排序,以便拥有“最近”到期日的任务的所有者是第一个,等等 我可以在Ruby中使用数组排序来实现这一点,但是我的记录集非常大,我需要使用AR/DBMS来实现这一点 更新: 当我思考这个问题时,我想到了部分解决方案,尽管我不知道如何在AR中实现 要根据所有
class owner
has_many :tasks
end
class task
belongs_to :owner
end
现在,我想根据任务的到期日对所有者进行排序,以便拥有“最近”到期日的任务的所有者是第一个,等等
我可以在Ruby中使用数组排序来实现这一点,但是我的记录集非常大,我需要使用AR/DBMS来实现这一点
更新:当我思考这个问题时,我想到了部分解决方案,尽管我不知道如何在AR中实现 要根据所有者的任务对其进行排序,只有一个任务(每个所有者)是相关的,即具有最接近截止日期的任务 我将如何使用AR来获取所有的所有者,按照他们的任务和最接近的到期日排序 更新2:
Task.order("due_date DESC").maximum("due_date", :group => 'owner')
将实际给我owner对象,作为有序散列的一部分按正确顺序排序([owner]=>“到期日”)。好极了现在唯一的问题是,我如何告诉AR加载所有与所有者对象相关的任务。因为在这个时刻,我每次打电话都会发出一个查询
owner.tasks.each do |t|
在我看来
感谢您的任何帮助,我对这个(简单的???)问题非常着迷,欧文好吧,最后我自己想出来了
Owner.includes(:tasks).joins(:tasks).order("tasks.due_date").group(:id)
将根据任务中最接近的截止日期对所有者进行排序,并将立即加载所有任务,从而生成一个查询
更新:添加生成的SQL以响应下面姆拉登的评论
SELECT `owners`.* FROM `owners`
INNER JOIN `tasks` ON `tasks`.`owner_id` = `owner`.`id`
GROUP BY owner.id ORDER BY tasks.due_date DESC
干杯。发现只有通过纯粹的查询才能做到这一点:
Owner.find_by_sql('SELECT `owners`.*,
(SELECT `tasks`.`due_date`
FROM `tasks`
WHERE `owners`.`id` = `tasks`.`owner_id`
ORDER BY `tasks`.`due_date` DESC LIMIT 1) AS `last_due_date`
FROM `owners`
GROUP BY `owners`.`id`
ORDER BY `last_due_date` DESC;')
如果需要访问最后到期日
,则添加到所有者
模型:
def last_due_date
if attributes['last_due_date']
attributes['last_due_date']
else
tasks.order(due_date: :desc).limit(1).first.due_date if tasks.length > 0
end
end
你能把生成的SQL粘贴到这里吗?谢谢,谢谢。然而,我认为这个查询在Postgres中不起作用。我建议对
last\u due\u date
方法进行一次更改。问题是,如果属性由数据库返回并设置为nil
,Rails将继续并再次尝试对其求值。当您知道不应该存在数据库访问时,您将在日志中看到大量数据库访问,并且问题很难调试。我会将第一行更改为if attributes.has_key?('last_due_date')
。