ActiveRecord_AssociationRelation クラスの last メソッドと [-1] の扱いの違いについて
forecast
カラムを持つTerminalValue
というモデルから、
pry(main)> c.terminal_values.where(forecast: false).count
(0.9ms) SELECT COUNT(*) FROM "terminal_values" WHERE "terminal_values"."company_id" = $1 AND "terminal_values"."forecast" = 'f' [["company_id", 2249]]
=> 5
と正常に取得でき、
pry(main)> c.terminal_values.where(forecast: false).last
PG::SyntaxError: ERROR: zero-length delimited identifier at or near """"
LINE 1: ...ues"."forecast" = 'f' ORDER BY "terminal_values"."" DESC LI...
^
: SELECT "terminal_values".* FROM "terminal_values" WHERE "terminal_values"."company_id" = $1 AND "terminal_values"."forecast" = 'f' ORDER BY "terminal_values"."" DESC LIMIT 1
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: zero-length delimited identifier at or near """"
LINE 1: ...ues"."forecast" = 'f' ORDER BY "terminal_values"."" DESC LI...
^
: SELECT "terminal_values".* FROM "terminal_values" WHERE "terminal_values"."company_id" = $1 AND "terminal_values"."forecast" = 'f' ORDER BY "terminal_values"."" DESC LIMIT 1
from /Users/ironsand/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.1.0/lib/active_record/connection_adapters/postgresql_adapter.rb:862:in `prepare'
と、last
を使い最後に取得したものを取ろうとするとエラーになってしまいます。
ところが[-1]
を使えば正常に取得出来ました。
pry(main)> c.terminal_values.where(forecast: false)[-1]
TerminalValue Load (0.8ms) SELECT "terminal_values".* FROM "terminal_values" WHERE "terminal_values"."company_id" = $1 AND "terminal_values"."forecast" = 'f' [["company_id", 2249]]
エラー原因は"terminal_values".""
というSQL文として構文エラーになるものをRailsが吐き出すためとはわかりました。
また本質的な問題部分はそこではなくc.terminal_values.where(forecast: false)
にorder(:date)
を付随させ順序を明確にする必要が有ることもわかったのですが、何故last
と[-1]
で違う動作になるような実装になっているかの疑問が残りました。
この違いは何か意図があっての動作なのでしょうか?