rails3でHABTMが非推奨になってる

rails3でhas_and_belongs_to_manyを使ったActiveRecordを作ったらワーニングが出た。

DEPRECATION WARNING: Having additional attributes on the join table of a has_and_belongs_to_many association is deprecated and will be removed in Rails 3.1. Please use a has_many :through association instead. 


rails3.1で消されちゃうよ、だと?
うーん、そんな運命なのであれば使うのはやめよう。

で、対応としてはhas_many :throughを使えと。。。

ということで、こんなイメージの、
Hoges←(HABTM)→Moges
HABTMでつないでいた多対多の関係であった2つのmodelをhas_many+throughにしてみる。

変更前
class Hoges < ActiveRecord::Base 
has_and_belongs_to_many :moges 
end
class Moges < ActiveRecord::Base
has_and_belongs_to_many :hoges
end

変更後
class Hoges < ActiveRecord::Base
has_many :hoges_moges
has_many :moges, :through => :hoges_moges
end
class Moges < ActiveRecord::Base
has_many :hoges_moges
has_many :hoges, :through => :hoges_moges
end


has_and_belongs_to_manyを使うと自動的に中間テーブル?名を作ってSQLに組み込んでくれるって本に書いてあるけど、has_many使うと自動じゃなくなるのですか。そうですか。

自動じゃなくなるので、中間テーブルのmodelが必要になりました。HABTMでは存在しなかった中間テーブルのmodelクラスを作ってあげる。
で、has_manyに対応するbelongs_toが必要なんだが、HABTMは多対多の関係を表すので両方向にbelongs_toをつけてあげる。

class HogesMoges < ActiveRecord::Base
belongs_to :hoge
belongs_to :moge
end

いちおう、これで良いらしい…。

中間DBのmodelを作らないといけないのが面倒だけど、rails3やるなら最初からそのつもりで作ればいいのか。


コメント

Unknown さんの投稿…
こんにちわ。

実はこれはhabtm自体が非推奨になっているわけではあないんですよね。habtmのjoinテーブルに余計なカラムがあったら警告がでるようになっています。

この場合だとhoges_mogesテーブルにタイムスタンプのような余計なカラム(hoge_id,moge_id以外の)がついてないですかね。
そういう場合はhas_many :through を使わないといけなくなるそうです。
GKI さんの投稿…
nariさん>
確かにdatetimeのカラムが入ってました…。

ありがとうございます、勉強になりました!

このブログの人気の投稿

ユースケースポイント法(UCP法)

COCOMO(工数と工期)

seleniumをmacで使いたいメモ1