Rails3で同一モデルに対する多対多参照を作る

Rails3で、モデルの多対多参照を実現するにはhas_manyの:throughオプションで簡単に実現することができる。
が、同一モデルで多対多をやろうとすると、ちょっと工夫が必要だ。同じモデルへの外部参照キーが二つできるので、それぞれ別名をつけてやる必要があるからだ。
参考にしたのは次のページ。
Rails self-referential has_many through with custom naming of join table

ここでは、ユーザが他のユーザと友達登録することを想定する。UserモデルがFriendモデルを通して多対多の関連を持つ。
ポイントはFriendクラスへのhas_many参照を作り、そのmas_many参照をthroughしてその先のUserクラスのインスタンスを取得する部分かな?
has_manyのsourceがfromとtoが逆なのは、その関連の先のユーザを取りたいからだ。
fromで検索した関連で、その相手であるto_userを参照すると。

ユーザクラス

class User < ActiveRecord::Base
  attr_accessible 略

  has_many :from_friend_relations, :foreign_key => "from_user_id", :class_name => "Friend"
  has_many :to_friend_relations, :foreign_key => "to_user_id", :class_name => "Friend"

  has_many :from_friends, :through => :from_friend_relations, :source => :to_user
  has_many :to_friends, :through => :to_friend_relations, :source => :from_user
end

関連用クラス to_user_idとfrom_user_idを持つ。

class Friend < ActiveRecord::Base
  attr_accessible :from_user_id, :to_user_id

  belongs_to :from_user, :class_name => "User"
  belongs_to :to_user, :class_name => "User"
end

友達登録に方向は関係ないので、user.friendsの一発で取れれば良いんだけど、fromとtoで別々になっちゃう。
一発で取りたい場合はSQL書かないとダメぽ。

No Comments

Post a Comment

コメントを投稿するには、下の計算の答えを入力する必要があります。答えは半角数字で入力してください。 * Time limit is exhausted. Please reload the CAPTCHA.