按序列化属性中的第一个键值排序集合

Order collection by first key value in serialized attribute

我有一个带有序列化属性的 Comment 模型:

  serialize :edit, Hash

通过插入 key/value 对来为评论的每个编辑添加时间戳:

self.edit[DateTime.current] = edit_content

我如何排序评论集合,所有评论都按每个评论的第一个提交时间戳排序?

你不能。您的 edit 列将数据存储为序列化字符串,因此其内容基本上如下所示:

[3] pry(main)> a = {}
=> {}
[4] pry(main)> a[DateTime.current] = 'bla'
=> "bla"
[5] pry(main)> a[DateTime.current] = 'bla bla'
=> "bla bla"
[9] pry(main)> a.to_yaml
=> "---\n!ruby/object:DateTime 2015-10-04 21:38:02.611020000 Z: bla\n!ruby/object:DateTime 2015-10-04 21:38:06.594140000 Z: bla bla\n"
[10] pry(main)> puts a.to_yaml
---
!ruby/object:DateTime 2015-10-04 21:38:02.611020000 Z: bla
!ruby/object:DateTime 2015-10-04 21:38:06.594140000 Z: bla bla
=> nil

为了使其按数据库排序table,您需要将您的编辑提取到另一个实体(例如 Revision 并创建 revisions table),或者,例如,制作一个 comments.first_edit_date 列并像往常一样按它排序。

P.S。当然,您可以将 all 您的 comments table 加载到内存中,然后在那里对其进行排序,但这会对性能产生巨大影响:

# DON'T DO THIS IN PRODUCTION
Comment.all.sort_by { |comment| comment.edit.keys.first }