首页 > 解决方案 > 如何对不同对象类型的数组进行排序?

问题描述

我有一个带有两个子模型的 JournalDay 模型:journal_entries 和 completed_to_dos。

我创建了一个方法 journal_entries_and_to_dos,它结合了给定 JournalDay 的所有 journal_entries 和 to_dos,但我不知道如何对其进行排序,因为我需要按不同的对象变量名称排序:journal_entries.created_at 和 to_dos.completed_at。

我已经了解了下面的代码来创建组合的 journal_entries_and_to_dos 数组。我怎么能按 journal_entries.created_at 和 completed_to_dos.completed_at 对其进行排序?

class JournalDay < ApplicationRecord
  has_many :journal_entries
  has_many :completed_to_dos, -> { where.not(completed_at: [nil,""]) }, class_name: 'ToDo'

  def journal_entries_and_completed_to_dos
    combined = []
    self.journal_entries.each do |journal_entry|
      combined << journal_entry
    end
    self.completed_to_dos.each do |completed_to_do|
      combined << completed_to_do
    end
  end

标签: ruby-on-rails

解决方案


它看起来像以下工作:

combined.sort_by { |obj| obj.class == "ToDo" ? obj.completed_at : obj.created_at }

这基本上使用 sort_by,如果对象类是“ToDo”,我们使用“completed_at”,否则我们使用“created_at”作为排序变量。


推荐阅读