Followerの取得

引き続きTwitterもどき「monologue」の作成。
昨日作ったフォロー中のユーザ(followee)の取得に加えて、逆方向、つまり自分をフォローしているユーザ(follower)を@user.followersで取得できるようにしてみます。

まずFollowsテーブルからfollowee_idが自分のidであるものを全て検索し、その各user_idを使ってUserを取得すれば良さそうです。
これをActiveRecordで記述すると、以下のようになります。

UserモデルとFollowモデル間の関連を記述(フォロー先→フォロー元)

まずUserモデル側。

  has_many :follower,  :foreign_key => :followee_id, :class_name => 'Follow', :dependent => :destroy
  has_many :followers, :through => :follower, :class_name => 'User'

次にFollowモデル側。

  belongs_to :follower, :class_name => 'User', :foreign_key => :user_id

  validates_associated      :follower

規約から外れているものが多いので、指定がたくさんになりますが。。

最初のhas_many: follower 〜は、User#id => Follow#followee_idの関係を示しています。またUserを削除したら対応するFollowも自動的に削除します。名前が単数形なのはhas_manyの規約とマッチしてなくてインチキ臭いが良い名前が思いつかなかった…。

次の has_many :followers 〜で、先ほどの「follower」を通してUserを関連づけていることを示しています。

最後にbelongs_to :follower で、user_idを使ってUserを捜すことを指定し、またその関連付けが正しいことのチェックを行うようにしています。


以上で、@user.followersでフォロワが取得できるはずです。

ビューを作ってみる

昨日のFolloweeの時と同じように、ビューを書いて試してみます。

<b>このユーザをfollow中のユーザ:</b><br>
<% @user.followers.each do |u| %>
  <div class="follow"><%= link_to( h(u.login), :action => :index, :id => u.login ) %></div>
<% end %>


うまくいった。