Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何根据子类的属性对父类进行排序?_Ruby On Rails_Ruby On Rails 3_Activerecord - Fatal编程技术网

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')