Ruby/ActiveRecord/PK以外のidというカラムの値を取る

Ruby/ActiveRecord/PK以外のidというカラムの値を取る

バージョンと製造年月日

2009年05月20日

id なんてカラム作るなよボケ!

ActiveRecord では検索結果 model でその値はアクセサによってアクセスできるが・・・id という名前のアクセサは自動的にPKを指すものになる。 model に明示的に PK を指示してもそのカラムが id の alias のように働く。

さらにすべてのオブジェクトは Object クラスから継承されているわけで、ActiveRecord は意図的に Object の id メソッドをオーバーライドして使っている。 本来の id は id という名のメソッドに控えてあって、アクセスできないわけではないので、これはActiveRecordの世界。

ここでさらに id が入ってくると、どういう動きになるかは予想できない、結果 id は単にPKの値を指すわけになっているわけだがね。

find_by_sqlで直接取る

find_by_sql を使い出力カラムに as を使い別名を指定した場合、model にはその別名でのアクセサが自動的に作成され、その値は文字列として格納される。

だからこういう風にすれば一応取得できる。

a = Hoge.find_by_sql(["SELECT id as piyo_id FROM hoges WHERE hoge_id = ?", 123])
p a.piyo_id

こんなやり方は間違っていると思うのでちゃんと設計すべきだと思う。

タグ

ruby/activerecord/get_no_pk_id_column_value.txt · 最終更新: 2015-12-21 17:25 by ore