具有关联的多级排序

时间:2011-08-23 17:52:55

标签: ruby-on-rails ruby-on-rails-3 sorting

我的设置:Rails 3.0.9,Ruby 1.9.2

以下是我的模特

class Project
  has_many :tasks
  has_many :photos

class Task
  belongs_to :project

class Photos
  belongs_to :project

我需要的是能够返回首先按项目名称(ASC)排序的结果集,然后交错按日期排序的任务和照片(DESC)。这是我需要的订单的示例输出

project: install new roof
  photo: ...(added on 7/15/11)
  task: ...(added on 7/10/11)
  task: ...(added on 7/1/11)

project: repair bathtub
  task: ... (added on 8/21/11)
  photo: ... (added on 8/20/11)
  photo: ...(added on 8/17/11)
  task: ... (added on 8/15/11)

我更喜欢从ActiveRecord获取整个结果集,然后在Ruby中对其进行排序,但不确定如何进行,任何见解都将非常受欢迎。感谢。

1 个答案:

答案 0 :(得分:1)

这样的事情怎么样?从数据库中急切加载所有对象,然后使用Array#sort!对其进行排序。

# First, grab all projects and their task/photos from the DB
projects = Project.includes(:tasks, :photos).order("project_name ASC")

# Now, iterate over projects, combine tasks/photos, sort by date
projects.each do |p|
  tasks_and_photos = p.tasks + p.photos
  tasks_and_photos.sort! { |x,y| y.created_at <=> x.created_at }
  # now do something with the tasks and photos!
end

为此添加注释,如果您不想在排序条件中使用created_at属性,那么您需要做的就是确保PhotoTask有一些具有通用名称的属性,例如date_added或其他。只要有一个具有通用名称的东西可以排序,你就可以了。