###Activerecordの不自然な動作
Activerecordでちょっと不自然な動作を見つけたのですが、ググっても
あまり問題になっていないので皆さんどう思っているのか、どうしているのか聞いてみたくなりました。
例えば以下のようなモデルを作成します
class App < ActiveRecord::Base attr_accessor :hoge end
前提としてhogeはデータベースに持っていないカラムで、
mogeはデータベースに持っているカラムです。
以下のようなコードでは、mogeが1で取得されますが
App.select("1 AS moge").where(:id => 1).first.moge
以下の場合はhogeがnilになりました。
App.select("1 AS hoge").where(:app_id => 1).first.hoge
どうやらデータベースのカラムで持っていなくて、attr_accessorにある場合は
クエリの結果で上書きするのではなく、このインスタンスのhogeにアクセスしているらしく
nilになってしまいました。
この場合、hogeを保存するには以下のようにしないといけないのでしょうか?
row = App.select("1 AS hoge").where(:app_id => 1).first row = App.new(row.attributes.compact)
普通に考えてクエリの結果の方を優先して欲しいのですが、そのような動作になってないようです。。
ちなみにバージョンはRails 4.1.4、ruby 2.1.2p95です。
###補足
App.select("1 AS hoge").where(:app_id => 1).first[:hoge]
で取得しろってことですかねえ。。
カラムhogehogeがある場合
App.select("1234 AS hogehoge").where(:app_id => 1).first[:hogehoge]
でも
App.select("1234 AS hogehoge").where(:app_id => 1).first.hogehoge
でも1234になるのに。。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/15 03:54