Rails の単一テーブル継承についての質問です。

単一テーブル継承を使用するために、テーブルにtype 列を作成したのですが、これのために、以下のようなwarningメッセージが出るようになりました。

/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_proxy.rb:217: warning: Object#type is deprecated; use Object#class

これを止めるにはどのような方法がありますか?
Object#type が deprecated だというのはわかったのですが、deprecated になったときに、単一テーブル継承の仕組み、もしくはActiveRecotd の方で対策が取られなかったのでしょうか?

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2011/01/19 00:09:30
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:nuna No.1

回答回数32ベストアンサー獲得回数11

ポイント60pt

type フィールドにアクセスするには、record.type ではなく record[:type] とハッシュの形式を使ってください。

元々 Ruby にあったメソッド Object#type と名前がかぶっているため、record.type としたときには type フィールドへのアクセスではなく、Object#type メソッドが呼ばれています。

呼ばれた Object#type は非推奨メソッドで Object#class が同機能の新しいメソッドなので deprecated の warning が出ています。

なお、これは Ruby 本体が出している warning で ActiveRecord は関係ありません。


あるいは、カラム名を type ではなく他の名前にすればメソッド名との重複を避けることができます。

http://www.tatvartha.com/2009/08/rails-single-table-inheritance-...

id:norisuke3

回答ありがとうございます。

エラーメッセージからわかるように、その record.type を呼んでいるのが、ActiveRecord のライブラリ内なので、まぁ、手を入れようと思えば入れられますが、みなさん、普通はどうされているのかなと思ったのが質問の動機です。単一テーブル継承を使うと必ず遭遇する問題だと思ったので、解決されてないのが不思議に思えました。

inheritance_column にtypeに変わる新しいコラム名を入れてあげればいいんですね。

2011/01/14 11:26:02
  • id:nuna
    association_proxy.rb:217 は @target.send(method, *args) ですので、ActiveRecord 自体が type は呼んでません。たぶんどこか別のところで type を呼んでるのだと思います。

    >inheritance_column にtypeに変わる新しいコラム名を入れてあげればいいんですね。

    norisuke3さんが関知しないところで type が呼ばれているのだとすると、inheritance_column の設定を変えても結局どこかで type が呼ばれていることは変わらず warning は出力されるはずです。

    もしかすると使っているプラグインなどで type を呼んでいるのかもしれませんね。
  • id:norisuke3
    再コメント有難うございます。
    後で試してみて、どうなるか見てみたいと思います。
    試してみた際には、またレスします。
  • id:norisuke3
    gems/activerecord-2.3.5/lib/active_record/ の中で起きているWarningだったので、ライブラリ中の問題かと思ったのですが、私のプログラムの中で、.type を使っており、それを動的にライブラリ内でメソッドコールが行われていたので、ライブラリの中でエラーが起きている旨のWarningメッセージが表示されていました。

    .type を全て[:type]と書き直すことで、Warning メッセージが出なくなりました。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません