我有一个有task
表的数据库。在该表中,有一个date
列。这些日期格式化为字符串,不是Date
。
我正在尝试按日期对这些任务进行排序。我已经有一个名为tasks
的任务数组。我正在尝试使用以下代码将其替换为名为tasksByDate
的已排序数组。
tasksByDate = tasks.sort_by do |task|
task[:date].to_date
end
我得到的错误是:
TypeError: no implicit conversion of Symbol into Integer
我也试过没有to_date
只是为了看它是否会在没有日期的情况下对其进行排序,只是作为一个字符串。
date
字段的格式为字符串,如2016-08-29
。我在代码中的其他地方使用了to_date
方法,它工作得很好,所以我并不认为这是问题所在。
修改1
我已经检查过任务实际上包含一个日期,并且其格式与解释相同。
p task.class
的输出为Array
修改2
p task
的输出是
[#<User id: 10, login: "my.name", hashed_password: "", date: "2016-08-29">]
答案 0 :(得分:1)
这些元素的嵌套深度比您预期的要深。将您的代码更改为:
# use '{ }' instead of 'do end' for a single-line blocks
tasksByDate = tasks.sort_by { |task| task.first[:date].to_date }
说明:
您看到p task
的输出:
[#<User id: 10, login: "my.name", hashed_password: "", date: "2016-08-29">]
这意味着这是一个元素数组。注意括号[ ]
。因此,在这种情况下您需要做的是task.first
,它将返回:
#<User id: 10, login: "my.name", hashed_password: "", date: "2016-08-29">
从那里你可以通过一个键来访问元素的值,就像你想要的那样:
task.first[:date]