さて、なんか関連付けが少し理解出来たようだし、
FriendモデルとUserモデルを、ちょっと解りやすく書き直しましょうか。
Rails開発日記さんには申し訳ないけどwwww
まず、Friendモデル。まるっと貼っちゃいましょう。その方が解り易いよね?
app/models/friend.rb
class Friend < ActiveRecord::Base belongs_to :asked_to, :foreign_key => :was_invited_user_id, :class_name => "User" belongs_to :was_invited_from, :foreign_key => :asked_user_id, :class_name => "User" def self.friendships(user) friends = user.asked_friends & user.was_invited_friends end end
相互に友達だと認識している友達を見るメソッド名も、変更したよ:-)
んで、Userモデル。こっちは、diffで;-)
app/models/user.rb
- has_many :friend_ships, :foreign_key => 'my_id', - :class_name => 'Friend', - :dependent => :destroy - has_many :befriend_ships, :foreign_key => 'friend_id', - :class_name =>'Friend', - :dependent => :destroy - has_many :friends, :through => :friend_ships, - :source => :friend_shipped - has_many :be_friends, :through => :befriend_ships, - :source => :befriend_shipped + has_many :asked, :foreign_key => 'asked_user_id', + :class_name => 'Friend', + :dependent => :destroy + has_many :was_invited, :foreign_key => 'was_invited_user_id', + :class_name =>'Friend', + :dependent => :destroy + has_many :asked_friends, :through => :asked, + :source => :asked_to + has_many :was_invited_friends, :through => :was_invited, + :source => :was_invited_from
んで、Friend.friendshipsメソッドを使っているコントローラ、書き換える。
app/controllers/user/friends_controller.rb
- @friends = Friend.own_friends(current_user) + @friends = Friend.friendships(current_user)
んで、マイグレーションも書き換えた。
db/migrate/*数字*_create_friends.rb
create_table :friends do |t| - t.column "my_id", :integer, :null => "false" - t.column "friend_id", :integer, :null => "false" + t.column "asked_user_id", :integer, :null => "false" + t.column "was_invited_user_id", :integer, :null => "false" t.timestamps
じゃあ、テストも書き直しましょうか。
まず、フィクスチャ。diffだとややこしそうだから、まるっと貼る。
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html quentin_has_friend_ship_to_aaron: asked_user_id: 1 was_invited_user_id: 2 aaron_has_friend_ship_to_admin: asked_user_id: 2 was_invited_user_id: 4 admin_has_friend_ship_to_aaron: asked_user_id: 4 was_invited_user_id: 2
んで、Friendモデルのテスト。これもdiffだと見にくいから、全部貼ろう。
test/unit/friend_test.rb
require File.dirname(__FILE__) + '/../test_helper' class FriendTest < ActiveSupport::TestCase test "should user has asked to friends" do user = users(:quentin) assert_equal(user.asked_friends.count, 1) end test "should user has was invited from friends" do user = users(:aaron) assert_equal(user.was_invited_friends.count, 2) end test "should user has friendships" do user = users(:aaron) friendships = Friend.friendships(user) assert_equal(friendships.count, 1) end end
ああ、そうそう。
どうでもイイけど、
英語とか、かなりいい加減だからwwwwww
そんな感じで:-)