按序列化属性中的第一个键值排序集合
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 }
我有一个带有序列化属性的 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 }