Webフレームワークの新しい波 Waves探訪記

第5回 Twのユーザにフォローする/されるの関係を導入する

この記事を読むのに必要な時間:およそ 3 分

コンソールで試してみる

これでUserモデルに以下のような新しいメソッドが追加されたはずです。

followed_users
自分をフォローしているユーザを返すデータセット(後述)
following_users
自分がフォローしているユーザを返すデータセット(後述)
add_followed_user
パラメータのユーザを,新たに自分をフォローするユーザに追加する
add_following_user
パラメータのユーザを,新たに自分がフォローしているユーザに追加する
remove_followed_user
パラメータのユーザを,自分をフォローするユーザから削除する
remove_following_user
パラメータのユーザを,自分がフォローしているユーザから削除する

正しくフォローする/される関係が作れたか,waves-consoleで試して見ましょう。Usersテーブルにはfooという名前のユーザとhogeという名前のユーザが存在するものとします。

コンソールで確認する

>> u1 = Tw::Models::User.find(:name=>'foo')
=> #<Tw::Models::User @values={:name=>"foo", :password=>"bar", :id=>2}>
>> u2 = Tw::Models::User.find(:name=>'hoge')
=> #<Tw::Models::User @values={:name=>"hoge", :password=>"hoge", :id=>3}>
>> u1.following_users
=> #<Sequel::SQLite::Dataset: "SELECT * FROM users INNER JOIN followed_following ON (followed_following.followed_id = 2) AND (fo
llowed_following.following_id = users.id)">
>> u1.following_users.all
=> []
>> u1.add_following_user(u2)
=> #<Tw::Models::User @values={:name=>"hoge", :password=>"hoge", :id=>3}>
>> u1.following_users.all
=> [#<Tw::Models::User @values={:following_id=>3, :followed_id=>2, :name=>"hoge", :password=>"hoge", :id=>3}>]
>>

「u1 = Tw::Models::User.find(:name=>'foo') 」で,Usersテーブルからnameカラムの値が'foo'であるようなユーザを取り出しています。u2も同様に設定します。

「u1.following_users」では,フォローしているユーザの配列(今は何も設定していないので空配列)が返るのではなく,Sequelのデータセットが返ってきます。

データセットとはRDBのビューのようなものです。対象となるデータを取得するための手続きで,データセットにallやfindなどのメソッドを呼ぶことで,初めて実際のデータを得ることができます。⁠u1.following_users.all」が,それです。空配列が返っているのが分かります。

ここに実際にフォローするユーザを「u1.add_following_user(u2)」で追加します。⁠u1.following_users.all」でu2のユーザのオブジェクトの配列が返ってきています。

ちょっとした問題

ここでもう一度「u1.add_following_user(u2)」するとどうなるでしょうか。実は何のエラーも表示されずにu2が再度追加されしまいます。⁠u1.following_users.all」では同じオブジェクトが2つ入った配列になります。これはまずいので,Twでは追加前にチェックするようにします。

まとめと次回の予定

Twitterのメンバー間に存在するフォローする/されるという関係をTwでもまねてみました。Userモデル間に多対多の関連を設定することで,シンプルに実装できることが分かると思います。次回はUIを作ってTwを完成させたいと思います。

著者プロフィール

松永肇一(まつながけいいち)

株式会社ライフメディア 創造推進部プロジェクトマネージャ。東京都出身。千葉大学工学部での卒論テーマは人工知能関連だったが,富士通に入社後はPCのソフトウェア開発に関わる。"GNU for Towns"のために,リチャード・ストールマンに会いにいくような妙な仕事を経て現職。Ruby on Railsを使ってWebアプリを開発する毎日。ブログは「ma2の日記」。

URLhttp://d.hatena.ne.jp/ma2/