2007-09-25 優しいRailsの育て方 [長年日記]

[Rails] ActiveRecord で使ってはいけないカラム名

L1 L3
ヒモがあるから、次のカラム名は危険だよ!
L6 L9 L8

  • conditions
  • target
  • proxy_XXX

proxy_XXX は今のところは owner, reflection, target の3つだけだけど、将来拡張される恐れがあるので "proxy_" は使わない方がいいよ。

(※ 他にも "reset", "clear" とかもダメだけど、この手の動詞をカラム名に使うのはそもそもよろしくないので割愛)

保護者の方へ

平素より、ActiveRecordをご愛顧賜り、誠にありがとうございます。AR はその名の通り ActiveRecord パターンを利用しており、データへのアクセスを便利にするためにカラム名のアクセサメソッドが自動的に作成されます。従って、RubyもしくはARの既存のメソッド名と競合すると誤動作する可能性がありますので、お子様がご使用になられるカラム名には十分ご注意下さい。

これらは、script/console にて以下のコードで直接確認することができ、これまでに以下の179種類の予約語が確認されています。

script/console

>> ActiveRecord::Base.instance_methods
=> ["instance_values", "locking_enabled?", "before_create", "save_with_validation", ...
>> ActiveRecord::Base.instance_methods.size
=> 179
>> ActiveRecord::Base.instance_methods.include? "nksk"
=> false

上記の情報は既出のものですが、これらに加え、今回新たに前述の新種(3個)が存在することが判明しましたので、ここに記載します。

[寝る子は] キューティースナイパー (再現コード)

L1 L3
俺の名前は中島早貴。通称nksk。ライバルのマイマイと業界3位の座を争う凄腕のスナイパーさ。
L6 L9 L8

モデル

class Sniper < ActiveRecord::Base
  has_one :mission
end
# t.column "name",   :string   # スナイパー名

class Mission < ActiveRecord::Base
  belongs_to :sniper
end
# t.column "name",   :string   # 作戦名
# t.column "target", :string   # 標的

L1 L3
今日の依頼は、最近冴えが見えない寺田光男に刺激を与える事だ。久々の大物にオラわくわくすっぞ!
L6 L9 L8

nksk = Sniper.create!(:name=>"nksk")
nksk.create_mission(:name=>"僕らの輝き", :target=>"寺田光男")

L1 L3
仕事の前に目標を確認しておこう。この勤勉さが業界3位の秘訣さ!(本当はまだ4位)
L6 L9 L8

mission = Mission.find(:first)
mission.target
# => "寺田光男"

L1 L3
よう、nksk!
L6 L9 L8
L1 L3
おぅ、マイマイの。お前さん、何しに来なすった?
L6 L9 L8
L1 L3
この辺に凄腕のスナイパーがいると聞きやして、ちょいとご挨拶に寄らせてもらいやした。
L6 L9 L8
L1 L3
上等だ。俺の今回のターゲットを聞いて、泣きべそかくなよ!
L6 L9 L8
L1 L3
ほう。見せてもらおうか
L6 L9 L8

nksk = Sniper.find(:first)
nksk.mission.target
# => #<Mission:0xf6e58b88 @attributes={"sniper_id"=>"1", "name"=>"僕らの輝き", "id"=>"1", "target"=>"寺田光男"}>

L1 L3
はぁ?頭、大丈夫?nkskのやつ、騙しやがって!
L6 L9 L8
L1 L3
こいつ昔から寝ボケると虚言癖があるんだよ
L6 L9 L8
L1 L3
違うの!違うの!ねぇ、どうしたらいいんだろう?
L6 L9 L8

Mission を直接使う分には問題がなくて、関連で参照した場合にだけ意図せぬ動作になるという恐ろしい罠。知らないと2,3日遊べるので注意。根本はいわゆる ActiveRecord の黒魔術部分であり、対応策は「このカラム名は使わない」しかないので、以下のブラックリストを頭に叩き込むか、印刷して机の前に張っておくしかなさそうだ。

  • conditions
  • target
本日のツッコミ(全3件) [ツッコミを入れる]
_ shio (2007-10-01 10:37)

危険なカラム名があったら warning か raise するようになってれば良いような。

_ 舞波 (2007-10-01 13:35)

たーしーかーにー。(ちなこ風に)。<br>でもそうすると黒魔術じゃなくて魔術になっちゃうからダメ><。<br>ダメじゃないけど。もしくは、内部用のメソッド名を "_target_" とかにするとかね。<br>今度 David に会ったら厳しく言っとくわ (もう会わない)

_ pie (2008-07-07 06:38)

この欄読んでたけど最近見事にハマった。"class" とか "index" とか "body" とかフツーにカラム名につけてたら、ヘルパーは発狂するわDB書き込みはできないわで、Rails初心者をパニックに陥れてくれた。雅ちゃんのキス画像見たベリヲタみたいに、これでRailsもRubyも嫌いになりそ。<br><br>・scaffold で生成したときに警告してくれよ。<br>・そもそもカラム名のアクセサメソッドなんか不要じゃないの? nksk[:target]でいいじゃん。


サイト内検索 (by Google)

| JRuby | Rails | Berryz | ℃-ute | エッグ | jQuery |

過去

2007年
9月
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

未来

コンタクト