ActiveRecordでselectしたはずのデータにアクセスできないんです
超はまった。。
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をうまく使えば何も気にしなくても良くなるのかな?