質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

2回答

2573閲覧

【rails5】時間を含むデータのorderメソッドがおかしい

besuko

総合スコア16

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2017/06/05 05:30

編集2017/06/05 05:33

###環境
Ruby 2.3.3p222
Rails 5.0.3

###問題
時間順でのorderメソッドがうまく反映されずにいます。

item(商品)モデルに紐づくDayTimeモデル(「Day(曜日)」と「Time(時間)」を持つ)を時間順に並べることに苦戦しています。

コンソール上でDayTimeの一覧を「order(:time)(時間順)」で表示を試みていますが、どうしてもその通りには並ばずにいます。
尚、他のカラムでのソートは問題なく使える状況です。

console

1irb(main):016:0> DayTime.where(item_id:7..11).order(:time) 2 DayTime Load (0.5ms) SELECT "day_times".* FROM "day_times" WHERE ("day_times"."item_id" BETWEEN ? AND ?) ORDER BY "day_times"."time" ASC [["item_id", 7], ["item_id", 11]] 3+---+-------+----+--------------------------------------+----------------------------------+----------------------------------+ 4| id | item_id | day |time | created_at | updated_at | 5+---+-------+----+--------------------------------------+----------------------------------+----------------------------------+ 6| 64 | 10 | 7 | 2000-01-01 08:40:00 +0900 | 2017-06-04 14:40:14 UTC | 2017-06-04 23:42:23 UTC | 7| 23 | 8 | 7 | 2000-01-01 20:00:00 +0900 | 2017-06-01 23:15:37 UTC | 2017-06-01 23:15:37 UTC | 8| 24 | 8 | 7 | 2000-01-01 23:00:00 +0900 | 2017-06-01 23:15:37 UTC | 2017-06-01 23:15:37 UTC | 9| 25 | 8 | 7 | 2000-01-01 00:00:00 +0900 | 2017-06-01 23:15:37 UTC | 2017-06-01 23:15:37 UTC | 10| 39 | 8 | 7 | 2000-01-01 01:00:00 +0900 | 2017-06-01 23:58:50 UTC | 2017-06-01 23:58:50 UTC | 11| 36 | 9 | 7 | 2000-01-01 01:00:00 +0900 | 2017-06-01 23:58:20 UTC | 2017-06-01 23:58:20 UTC | 12| 28 | 9 | 7 | 2000-01-01 02:00:00 +0900 | 2017-06-01 23:16:21 UTC | 2017-06-01 23:16:21 UTC | 13| 40 | 8 | 7 | 2000-01-01 03:00:00 +0900 | 2017-06-01 23:58:50 UTC | 2017-06-01 23:58:50 UTC | 14| 29 | 9 | 7 | 2000-01-01 03:00:00 +0900 | 2017-06-01 23:16:21 UTC | 2017-06-01 23:16:21 UTC | 15| 26 | 8 | 7 | 2000-01-01 04:00:00 +0900 | 2017-06-01 23:15:37 UTC | 2017-06-01 23:15:37 UTC | 16| 20 | 7 | 7 | 2000-01-01 05:00:00 +0900 | 2017-06-01 23:14:50 UTC | 2017-06-01 23:14:50 UTC | 17| 30 | 9 | 7 | 2000-01-01 05:00:00 +0900 | 2017-06-01 23:16:21 UTC | 2017-06-01 23:16:21 UTC | 18| 37 | 9 | 7 | 2000-01-01 06:00:00 +0900 | 2017-06-01 23:58:20 UTC | 2017-06-01 23:58:20 UTC | 19| 38 | 9 | 7 | 2000-01-01 07:00:00 +0900 | 2017-06-01 23:58:20 UTC | 2017-06-01 23:58:20 UTC | 20| 21 | 7 | 7 | 2000-01-01 08:00:00 +0900 | 2017-06-01 23:14:50 UTC | 2017-06-01 23:14:50 UTC | 21| 27 | 8 | 7 | 2000-01-01 08:00:00 +0900 | 2017-06-01 23:15:37 UTC | 2017-06-01 23:21:13 UTC | 22| 31 | 9 | 7 | 2000-01-01 08:00:00 +0900 | 2017-06-01 23:16:21 UTC | 2017-06-01 23:16:21 UTC | 23| 22 | 7 | 7 | 2000-01-01 09:00:00 +0900 | 2017-06-01 23:14:50 UTC | 2017-06-01 23:14:50 UTC | 24| 41 | 8 | 7 | 2000-01-01 12:00:00 +0900 | 2017-06-01 23:58:50 UTC | 2017-06-01 23:58:50 UTC | 25| 42 | 8 | 7 | 2000-01-01 14:00:00 +0900 | 2017-06-01 23:58:50 UTC | 2017-06-01 23:58:50 UTC | 26| 50 | 7 | 7 | 2000-01-01 21:00:00 +0900 | 2017-06-02 16:14:34 UTC | 2017-06-02 16:14:34 UTC | 27| 51 | 7 | 7 | 2000-01-01 22:00:00 +0900 | 2017-06-02 16:14:34 UTC | 2017-06-02 16:14:34 UTC | 28| 52 | 7 | 7 | 2000-01-01 23:00:00 +0900 | 2017-06-02 16:14:34 UTC | 2017-06-02 16:14:34 UTC | 29| 53 | 7 | 7 | 2000-01-01 00:00:00 +0900 | 2017-06-02 16:14:34 UTC | 2017-06-02 16:14:34 UTC | 30| 54 | 7 | 7 | 2000-01-01 01:00:00 +0900 | 2017-06-02 16:14:34 UTC | 2017-06-02 16:14:34 UTC | 31| 61 | 10 | 7 | 2000-01-01 01:00:00 +0900 | 2017-06-02 16:17:00 UTC | 2017-06-02 16:17:00 UTC | 32| 55 | 7 | 7 | 2000-01-01 02:00:00 +0900 | 2017-06-02 16:14:34 UTC | 2017-06-02 16:14:34 UTC | 33| 62 | 10 | 7 | 2000-01-01 02:00:00 +0900 | 2017-06-02 16:18:01 UTC | 2017-06-02 16:18:01 UTC | 34| 63 | 10 | 7 | 2000-01-01 06:00:00 +0900 | 2017-06-02 21:24:32 UTC | 2017-06-02 21:24:32 UTC | 35| 65 | 10 | 7 | 2000-01-01 07:00:00 +0900 | 2017-06-04 23:43:11 UTC | 2017-06-04 23:43:11 UTC | 36| 67 | 11 | 7 | 2000-01-01 08:00:00 +0900 | 2017-06-05 03:22:32 UTC | 2017-06-05 03:22:32 UTC | 37| 66 | 11 | 7 | 2000-01-01 10:00:00 +0900 | 2017-06-05 03:22:32 UTC | 2017-06-05 03:22:32 UTC | 38| 69 | 11 | 1 | 2000-01-01 14:00:00 +0900 | 2017-06-05 03:22:32 UTC | 2017-06-05 03:22:32 UTC | 39| 68 | 11 | 2 | 2000-01-01 16:00:00 +0900 | 2017-06-05 03:22:32 UTC | 2017-06-05 03:22:32 UTC | 40+---+-------+----+--------------------------------------+----------------------------------+----------------------------------+ 4134 rows in set

TimeZoneに原因があるのかと思い、approcation.rbを以下のように変更しました。
その他の原因箇所が検討もつかない状況ですので、お力をお借りできますと幸いです。

Ruby

1approcarion.rb 2 3+ config.time_zone = 'Tokyo' 4+ config.active_record.time_zone_aware_types = [:datetime, :time] 5+ config.active_record.default_timezone = :local

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

まず、これはRailsの質問なのでしょうか
まず、少なくともDBの種類を明記してください。
生成されたsqlからおそらくpostgressでしょうから
さらに、timeのDBに置ける型を調べてください。
timestanpなのかtime型なのかdatetime型なのかで話は違ってきます。
おそらくtimestanp with time zoneとかになっているのではないでしょうか?
time with time zoneに変えるか
プログラムを見直して、dayとtimeを統合することをオススメします。

とりあえず、私の方で、pg9.5.0でtimestanpとtime型とdatetime型でやって見た結果
このような問題は起きませんでした。
pdはORDER BY を指定しない場合、並び順は保障されないのでORDER BYが効いていない事も考えられます。
ググるとANDを途中で挟むとだめとか言う話もあるので。
.where(item_id:7..11)を.where("item_id=>?",7).where("item_id<=?",10)と置き換えて見てください

投稿2017/06/05 08:12

編集2017/06/09 08:26
moke

総合スコア2241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

besuko

2017/06/09 08:07

有難うございます。 ご指摘の通りDBはPostgresでございます。 現状、PGにおけるTimeの型を調べる方法を調べているところでございます。 せっかく迅速にご回答頂いたのにこちらからの返答が遅くなり申し訳ございません。。
moke

2017/06/09 08:25 編集

とりあえず、私の方で、pg9.5.0でtimestanpとtime型とdatetime型でやって見た結果、問題はなかったんですよね。 pdはORDER BY を指定しない場合、並び順は保障されないのでORDER BYが効いていない事も考えられます。 ANDを途中で挟むとだめとか言う話もあるので。 .where(item_id:7..11)を.where("item_id=>?",7).where("item_id<=?",10)と置き換えて見てください
besuko

2017/06/10 07:12

有難うございます。 ご助言頂きましたように試してみましたが、こちらはエラーが出てしまいました。。 irb(main):007:0> DayTime.where("item_id=>?",7).where("item_id<=?",10) DayTime Load (1.3ms) SELECT "day_times".* FROM "day_times" WHERE (item_id=>7) AND (item_id<=10) Hirb Error: PG::SyntaxError: ERROR: syntax error at or near "=>" LINE 1: ...CT "day_times".* FROM "day_times" WHERE (item_id=>7) AND (... ^ : SELECT "day_times".* FROM "day_times" WHERE (item_id=>7) AND (item_id<=10)
besuko

2017/06/10 07:16 編集

また、試行錯誤したところ「apprication.rb」のconfigをいじってみたところ、それ以前とその後で保存された値同士がORDER BYが効いていない可能性があるように思えました。 そういったことは考えられますでしょうか。。 (変更前) ```Ruby config.time_zone = 'Tokyo' config.active_record.time_zone_aware_types = [:datetime, :time] config.active_record.default_timezone = :local ``` ↓(変更後) ```Ruby #config.time_zone = 'Tokyo' config.active_record.time_zone_aware_types = [:datetime, :time] config.active_record.default_timezone = :utc ```
guest

0

Rails使ったことないので、検討違いな回答かもしれませんが、
ちょっとググった感じ「キャッシュ」とか「フェッチ」とかが問題かと思われます。

こちらの下のほうのコメントに書いてありますが、.to_a付けると期待通りの動きになると記載が、、、

投稿2017/06/05 06:29

szk.

総合スコア1400

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

besuko

2017/06/09 08:04

有難うございます。 「キャッシュ」や「フェッチ」がどういったものか理解出来ておりませんので、現在調べております。 .to_aも試してみましたが、残念ながら挙動が変わる事はありませんでした。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問