読者です 読者をやめる 読者になる 読者になる

ActiveRecordでselectしたはずのデータにアクセスできないんです

active record

超はまった。。

priceカラムを持つitemsテーブルがあるとして、商品の日々の価格を記録しているとします。
今日の価格が前日比でどうなったか知るべく、こんな調子のものを書いたとして

q = Item.find_by_sql(<<-SQL)
  select
    t1.price - t2.price as price_change
  from
    items t1
      inner join items t2
        on t1.id = t2.id
        and t2.register_date = 昨日
  where
    t1.register_date = 今日
SQL

puts q.first.price_change #=> nil

なんでや。。なんでnilなんや。。

そう、priceというカラムが既に存在するので、select句に書いた列別名price_changeに対しておそらくActiveRecordのattribute_changeが先に利いているものと思われます。
上の例でputs q.first.attributesするとちゃんとprice_changeが存在するので、おそらくそっちのせいでしょう。
列別名を別にしてあげればうまく差額を返してくれます。私はfluctuationに変えましたよ。。

今回はSELECT文の列別名のネーミングがActiveRecordの作法に合わなかっただけですが、既存のテーブルが似たような有様の場合は要注意ですね。
わざわざ列別名を用意してあげるとか、その列だけattributes[attr]って調子でアクセスするとか。scopeをうまく使えば何も気にしなくても良くなるのかな?