可以将时间戳存储为Hash中的键并使其可排序吗?

时间:2015-09-30 13:33:16

标签: ruby-on-rails ruby ruby-on-rails-4 active-model-serializers

我有一个用户可以编辑的评论模型。我想保存评论的每个新版本,以及它在Facebook中的运作方式。

我没有使用关联模型为每个新提交的编辑创建新记录,而是考虑使用Active Model' Serialization并为每个新编辑插入一个Hash键/值对

提交的文本将是编辑的关键值和时间。

是否可以将DateTime值保存为键,然后能够按键按时间顺序对哈希进行排序?如果是积极的,我将如何创建密钥?

1 个答案:

答案 0 :(得分:3)

我同意有关奇怪的评论,但是,可以在Ruby中完成。您可以将Time对象设置为哈希的关键字,如下所示:

hash = {}
hash[Time.now] = 'value'
hash
#=> {2015-09-30 11:45:41 -0500=>1}

如果您的时间初始化为字符串,则可以使用以下方法将其解析为Time对象:

Time.parse("12:00")
#=> 2015-09-30 12:00:00 -0500

最后,Ruby中的哈希值从版本1.8或1.9开始维护,但可排序,因此您可以使用Hash#keys创建一个仅包含键的数组,然后对键进行排序:

hash = {}
hash[Time.now] = 'value'
hash[Time.now] = 'value2'
hash[Time.now] = 'value3'
hash[Time.now] = 'value4'
hash[Time.now] = 'value5'
hash
#=> {
      2015-09-30 11:50:17 -0500=>"value",
      2015-09-30 11:50:18 -0500=>"value2",
      2015-09-30 12:04:05 -0500=>"value3",
      2015-09-30 12:04:04 -0500=>"value4",
      2015-09-30 12:04:06 -0500=>"value5",
    }

hash.keys
#=> [
      2015-09-30 11:50:17 -0500
      2015-09-30 11:50:18 -0500,
      2015-09-30 12:04:05 -0500,
      2015-09-30 12:04:04 -0500,
      2015-09-30 12:04:06 -0500,
    ]

shuffled_keys = hash.keys.shuffle
#=> [
      2015-09-30 12:04:04 -0500,
      2015-09-30 12:04:06 -0500,
      2015-09-30 11:50:18 -0500,
      2015-09-30 12:04:05 -0500,
      2015-09-30 11:50:17 -0500
    ]

latest_key = shuffled_keys.sort.last
#=> 2015-09-30 12:04:06 -0500

hash[latest_key]
#=> "value5"