なんか、もう、ね?

変わりすぎてて、diffとって見るのも、マンドクセwww


メソッド追加して、フィクスチャ書き換えて。
マイグレーションも書き換えて。<=ホントはコレ、しちゃダメwww


テストなんて、もう、全然別もんですよwww
つうか、ね?
script/consoleでテストしながらロジック作っている方が多くなってきましたよwww


マズい、ねwww
ちゃんとテスト書こうぜ、なあ?www


ちょっと、Rspecに移行するか?www


とりあえず、じゃあ、モデルから。
app/models/user.rb

+  def has_friends?
+    friends = self.asked_friends | self.was_invited_friends
+    if friends
+      return friends
+    else
+      return false
+    end
+  end
+
+  def has_friends_with_state?(state)
+    asked_friends = asked_friendships.with_state(state).collect do |friendship|
+      friendship.asked_to
+    end
+    was_invited_friends = was_invited_friendships.with_state(state).collect do |friendship|
+      friendship.was_invited_from
+    end
+    friends = asked_friends | was_invited_friends
+    if friends.empty?
+      return users
+    else
+      false
+    end
+  end
+
+  def has_friendship_to?(friend)
+    friendship = Friend.find(:first, :conditions => { :asked_user_id => [self.id, friend.id],
+                                                      :was_invited_user_id => [self.id, friend.id]
+    })
+    if friendship
+      return friendship
+      }
+    else
+      false
+    end
+  end
+
+  def asked_to?(friend)
+    friendship = Friend.find(:first, :conditions => { :asked_user_id => self.id,
+                                                      :was_invited_user_id => friend.id
+    })
+    if friendship
+      return friendship
+    else
+      false
+    end
+  end
+
+  def was_invited_from?(friend)
+    friendship = Friend.find(:first, :conditions => { :asked_user_id => friend.id,
+                                                      :was_invited_user_id => self.id
+    })
+    if friendship
+      return friendship
+    else
+      false
+    end
+  end
+

ああ、つうか、メソッドにコメント書いとけよwww

  • has_friends? =>hogehoge.has_friendsで、hogehogeとFriendで関連付けられたUserオブジェクトを返す。但し、無い場合はfalseを返す。
  • has_friends_with_state?(state) =>hogehoge.has_friendsで、hogehogeと第一引数で指定されたstateをもつFriendで関連付けられたUserオブジェクトを返す。但し、無い場合はfalseを返す。
  • has_friendship_to?(friend) => hogehoge.has_friendship_to?(friend)で、hogehogeと第一引数で指定したUserオブジェクトがFriendで関連付けされている場合、該当するオブジェクトを返す。*戻り値*.asked_toで誘ったUserオブジェクト、*戻り値*.was_invited_fromで誘われたUserオブジェクトが得られる。但し、無い場合はfalseを返す。
  • asked_to?(friend) =>hogehoge.asked_to?(friend)で、hogehogeと第一引数で指定したUserオブジェクトがFriendと関連付けされており、尚且つ、hogehogeが誘った側、第一引数のUserオブジェクトが誘われた側の場合、該当するFriendオブジェクトを返す。但し、そうでは無い場合、falseを返す。
  • was_invited_from?(friend) => hogehoge.was_invited_from?(friend)で、hogehogeと第一引数で指定したUserオブジェクトがFriendと関連付けされており、尚且つ、hogehogeが誘われた側、第一引数のUserオブジェクトが誘った側の場合、該当するFriendオブジェクトを返す。但し、そうでは無い場合、falseを返す。

という感じ。


まあ、「末尾に?が着いているメソッドは、true/falseのニ値を返す」というrails、というか、rubyの規範にはそぐっていない訳だけれどもwww
まあ、Booleanで欲しい時は、それはそれでちゃんと機能するんだから、ヨシとしようぜ?www
内容的には同じ処理なのに、?付きと?無しを定義するのも、面倒だし。
内容がある場合に、trueを返すか、その内容を返すかで、メソッドを別けるのも、ねえ?


その辺り、どうなんですか、ねぇ? => rubyistな皆さん。
なんか、railsって、富富豪的プログラミングに成りがちな気がするんだけど。
いやいや、大好きなんですよ。
「リソースなんて、金さえ払えば湧き出てくるんだから」って、思ってるし、ね?www


次、Friendモデルやね。
app/models/friend.rb

-  def self.friendships(user)
-    friends = user.asked_friends | user.was_invited_friends
-  end
-
-  def self.has_friendship?(user, friend)
-    friends = user.asked_friends | user.was_invited_friends
-    if friends.include?(friend)
-      friendship = Friend.find(:first, :conditions => { :asked_user_id => [user.id, friend.id],
-                                                        :was_invited_user_id => [user.id, friend.id]
-      })
-      return {:state => friendship.state,
-              :asked_user_id => friendship.asked_user_id,
-              :was_invited_user_id => friendship.was_invited_user_id 
-      }
+  def self.in_friendship?(user, friend)
+    friendship = Friend.find(:first, :conditions => { :asked_user_id => [user.id, friend.id],
+                                                      :was_invited_user_id => [user.id, friend.id]
+                                                    })
+    if friendship
+      return friendship.state
+  
+    else
+      return false
+    end

friendshipsとhas_friendships?は、削った。
つうか、Userモデルに移した。
よくよく考えたら、Userオブジェクトに対する操作なんだもん。当たり前やね。
んで、in_friendship?メソッド作った。
第一引数と、第二引数に入れられたUserオブジェクトが、Friendモデルで関連付けられている場合、該当するFriendオブジェクトのstateを返す。但し、関連付けられていない場合、falseを返す。


えーっと、コントローラは、要らないよねぇ?
別段、面白いコード書いている訳では無いし。
新たな発見があった訳でも無いし。


ビューも同じ。


ルーティングだけ、書いておきましょうか。
config/routes.rb

-    user.resources :friends, :member => { :add      =>  :get,
-                                          :submit     =>  :post
+    user.resources :friends, :member => { :add        =>  :get,
+                                          :submit     =>  :post,
+                                          :ask        =>  :put,
+                                          :be_invited =>  :put,
+                                          :accept     =>  :get,
+                                          :deny       =>  :get,
+                                          :purge      =>  :delete

acceptとかdenyとか、getメソッドになってるけど、なんか、putじゃアクセス出来ないんだよね...
理由が解らんwww
getだと、なんかセキュリティ的に問題があるような気がして病まないんだけど、その辺、どうなんすかね?


スキーマは、こんな感じ。
db/schema.rb

ActiveRecord::Schema.define(:version => 20081221091222) do

  create_table "friends", :force => true do |t|
    t.integer  "asked_user_id",                              :null => false
    t.integer  "was_invited_user_id",                        :null => false
    t.string   "state",               :default => "passive", :null => false
    t.datetime "made_friendship_at"
    t.datetime "deleted_at"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "message_types", :force => true do |t|
    t.string   "name",        :limit => 40, :null => false
    t.text     "description"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "messages", :force => true do |t|
    t.integer  "message_type_id",                        :null => false
    t.integer  "sender_id",                              :null => false
    t.integer  "reciever_id",                            :null => false
    t.string   "subject",                                :null => false
    t.text     "body",                                   :null => false
    t.string   "senders_state",   :default => "passive", :null => false
    t.string   "recievers_state",  :default => "passive", :null => false
    t.datetime "sent_at"
    t.datetime "recieved_at"
    t.datetime "deleted_at"
  end

  create_table "roles", :force => true do |t|
    t.string "name"
    t.text   "description"
  end

  create_table "roles_users", :id => false, :force => true do |t|
    t.integer "role_id"
    t.integer "user_id"
  end

  add_index "roles_users", ["role_id"], :name => "index_roles_users_on_role_id"
  add_index "roles_users", ["user_id"], :name => "index_roles_users_on_user_id"

  create_table "users", :force => true do |t|
    t.string   "email",                     :limit => 100
    t.string   "crypted_password",          :limit => 40
    t.string   "salt",                      :limit => 40
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "remember_token",            :limit => 40
    t.datetime "remember_token_expires_at"
    t.string   "activation_code",           :limit => 40
    t.datetime "activated_at"
    t.string   "state",                                    :default => "passive"
    t.datetime "deleted_at"
    t.string   "nickname",                  :limit => 100, :default => ""
    t.string   "family_name",               :limit => 100, :default => ""
    t.string   "middle_name",               :limit => 100, :default => ""
    t.string   "given_name",                :limit => 100, :default => ""
  end

end


これで、Userモデルとか、Friendモデルとか、それらの関連付けとかは、ちゃんと出来てると思うんだ。
お気楽便利メソッドも、ちゃんと作れている筈だし。