|
|
|
|
![]() |
|
proxy_XXX は今のところは owner, reflection, target の3つだけだけど、将来拡張される恐れがあるので "proxy_" は使わない方がいいよ。
平素より、ActiveRecordをご愛顧賜り、誠にありがとうございます。AR はその名の通り ActiveRecord パターンを利用しており、データへのアクセスを便利にするためにカラム名のアクセサメソッドが自動的に作成されます。従って、RubyもしくはARの既存のメソッド名と競合すると誤動作する可能性がありますので、お子様がご使用になられるカラム名には十分ご注意下さい。
これらは、script/console にて以下のコードで直接確認することができ、これまでに以下の179種類の予約語が確認されています。
>> 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個)が存在することが判明しましたので、ここに記載します。
![]() |
|
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 # 標的 |
![]() |
|
nksk = Sniper.create!(:name=>"nksk") nksk.create_mission(:name=>"僕らの輝き", :target=>"寺田光男") |
![]() |
|
mission = Mission.find(:first) mission.target # => "寺田光男" |
![]() |
|
|
![]() |
![]() |
|
|
![]() |
![]() |
|
nksk = Sniper.find(:first)
nksk.mission.target
# => #<Mission:0xf6e58b88 @attributes={"sniper_id"=>"1", "name"=>"僕らの輝き", "id"=>"1", "target"=>"寺田光男"}> |
![]() |
|
![]() |
|
|
![]() |
Mission を直接使う分には問題がなくて、関連で参照した場合にだけ意図せぬ動作になるという恐ろしい罠。知らないと2,3日遊べるので注意。根本はいわゆる ActiveRecord の黒魔術部分であり、対応策は「このカラム名は使わない」しかないので、以下のブラックリストを頭に叩き込むか、印刷して机の前に張っておくしかなさそうだ。
| 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 | ||||||
危険なカラム名があったら warning か raise するようになってれば良いような。
たーしーかーにー。(ちなこ風に)。<br>でもそうすると黒魔術じゃなくて魔術になっちゃうからダメ><。<br>ダメじゃないけど。もしくは、内部用のメソッド名を "_target_" とかにするとかね。<br>今度 David に会ったら厳しく言っとくわ (もう会わない)
この欄読んでたけど最近見事にハマった。"class" とか "index" とか "body" とかフツーにカラム名につけてたら、ヘルパーは発狂するわDB書き込みはできないわで、Rails初心者をパニックに陥れてくれた。雅ちゃんのキス画像見たベリヲタみたいに、これでRailsもRubyも嫌いになりそ。<br><br>・scaffold で生成したときに警告してくれよ。<br>・そもそもカラム名のアクセサメソッドなんか不要じゃないの? nksk[:target]でいいじゃん。