ruby-on-rails - 如何对不同对象类型的数组进行排序?
问题描述
我有一个带有两个子模型的 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
解决方案
它看起来像以下工作:
combined.sort_by { |obj| obj.class == "ToDo" ? obj.completed_at : obj.created_at }
这基本上使用 sort_by,如果对象类是“ToDo”,我们使用“completed_at”,否则我们使用“created_at”作为排序变量。
推荐阅读
- point-clouds - 3D Stereo_camera 和 2D LiDAR 点云数据融合
- reactjs - 如何在反应js中激活侧边菜单
- javascript - 如何从 Mongoose 的对象中查询数据?
- facebook - 如果此人不可用,如何通过 facebook-messenger API 向我的 API 发送任何操作?
- swift - 中间字符 swift
- mongodb - 计算mongo文档中重复的对象
- reactjs - 如何在 react-native 项目中使用 fire-base 进行谷歌身份验证?
- reactjs - 重绘后类别更改不正确
- javascript - 更改 reactJs 父级中的状态不会更改 react 子组件中的道具
- maximo - 如何使用本地浏览器时间覆盖 Maximo 服务器时间