2016-08-29 2 views
0

私はtaskテーブルを持つデータベースを持っています。この表にはdateの列があります。これらの日付は文字列としてフォーマットされており、Dateではありません。MySQLによって返された配列のRuby sort_by、日付は文字列でフォーマットされます

私はこれらのタスクを日付順に並べ替えようとしています。私は既にという名前のタスクの配列を持っています。私は、次のコードを使用して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

になっています。したがって、この場合には何をすべきかを返しますtask.first、あります列挙子内に:dateキーが存在することを確認しますか?また、混乱を避けるために、内部の 'タスク'変数名を 'タスク'に変更することもできます。ブロック内に 'p tasks'を入れて、どの値を出力するかを確認してください。 –

+0

あなたは出力を見るのが好きですか? tasks.map {| task |タスク} –

+0

@ Pawel Duda内部タスクをタスクに変更し、タスクを印刷すると日付キーを含めて正しく印刷されます。 – trueCamelType

答えて

1

です。それは、これは要素の配列であることを意味

[#<User id: 10, login: "my.name", hashed_password: "", date: "2016-08-29">] 

# 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[:date] 
+0

すべての助けをいただきありがとうございます。 '' '.first'''がなぜそれを次の層に持ち込むのか説明できますか?私はそれが配列の「最初の」要素を返すと仮定しましたか? – trueCamelType

+1

@trueCamelType私は説明を追加しました、それが十分かどうかを教えてください:) –

+0

素晴らしい、ありがとう! – trueCamelType

関連する問題