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]で違う動作になるような実装になっているかの疑問が残りました。

この違いは何か意図があっての動作なのでしょうか?