2011-08-15 8 views
0

私はそのようなことを扱っています。私はRailsで私のアプリケーションのために友達システムに取り組んでいます。そして、ユーザーに接続する2つだけでなく、user_id列の値をそれぞれ削除/更新するのが問題です。なぜ私はしたくないのですか?

たとえば、ユーザー1が友人にユーザー2に招待を送信した場合、[1、2、r]と[2、1、p]の2つの行が表示されます。要求されたRは保留中のPである。この時、ユーザー3とユーザー4がユーザー2の招待状を送信すると、2人に3つの招待状があります。そのユーザーが招待状の1つを削除または更新すると、その招待状のそれぞれが削除/更新されます(この状況では受け入れられます)。適切な行だけを削除/更新することで、正しく動作させるようにします。ここ

コードである:

ユーザモデル:

class User < ActiveRecord::Base 
    has_many :friends, :through => :user_friendships, :conditions => "status = 'a'" 
    has_many :requested_friends, :through => :user_friendships, :source => :friend, :conditions => "status = 'r'", :order => "user_friendships.created_at" 
    has_many :pending_friends, :through => :user_friendships, :source => :friend, :conditions => "status = 'p'", :order => "user_friendships.created_at" 
    has_many :user_friendships, :dependent => :destroy 
... 

UserFriendshipモデル:

class UserFriendship < ActiveRecord::Base 
    set_primary_key "user_id" 

    attr_accessible :user_id, :friend_id, :status 

    belongs_to :user 
    belongs_to :friend, :class_name => "User", :foreign_key => "friend_id" 
end 

友達コントローラ:

class FriendsController < ApplicationController 
    before_filter :load_user, :except => [:index, :show] 

    def index 
    @user = User.find_by_name(params[:user_id]) 
    if @user.nil? 
     flash[:Error] = t "generic.messages.error.user_not_exist" 
     redirect_to root_path 
    else 
     @title = @user.name 
    end 
    end 

    def show 
    redirect_to user_path(params[:id]) 
    end 

    def new 
    @friendship1 = UserFriendship.new 
    @friendship2 = UserFriendship.new 
    end 

    def create 
    @friend = User.find_by_name(params[:friend_id]) 
    params[:friendship1] = {:user_id => @user.id, :friend_id => @friend.id, :status => 'r'} 
    params[:friendship2] = {:user_id => @friend.id, :friend_id => @user.id, :status => 'p'} 
    @friendship1 = UserFriendship.create(params[:friendship1]) 
    @friendship2 = UserFriendship.create(params[:friendship2]) 
    if @friendship1.save && @friendship2.save 
     flash[:Info] = t "generic.friends.request_send" 
     redirect_to :back 
    else 
     flash[:Error] = t "generic.friends.request_error" 
     redirect_to :back 
    end 
    end 

    def update 
    @friend = User.find_by_name(params[:id]) 
    params[:friendship1] = {:user_id => @user.id, :friend_id => @friend.id, :status => 'a'} 
    params[:friendship2] = {:user_id => @friend.id, :friend_id => @user.id, :status => 'a'} 
    @friendship1 = UserFriendship.find_by_user_id_and_friend_id(@user.id, @friend.id) 
    @friendship2 = UserFriendship.find_by_user_id_and_friend_id(@friend.id, @user.id) 
    if @friendship1.update_attributes(params[:friendship1]) && @friendship2.update_attributes(params[:friendship2]) 
     flash[:Success] = t "generic.friends.added_to_friends" 
     redirect_to :back 
    else 
     flash[:Error] = t "generic.friends.added_error" 
     redirect_to :back 
    end 
    end 

    def destroy 
    @friend = User.find_by_name(params[:id]) 
    @friendship1 = UserFriendship.find_by_user_id_and_friend_id(@user.id, @friend.id).destroy 
    @friendship2 = UserFriendship.find_by_user_id_and_friend_id(@friend.id, @user.id).destroy 
    flash[:Info] = t "generic.friends.friend_removed" 
    redirect_to :back 
    end 

    private 

    def load_user 
     authenticate 
     correct_user 
    end 

    def authenticate 
     deny_access unless signed_in? 
    end 

    def correct_user 
     @user = current_user 
     redirect_to(root_path) unless current_user?(@user) 
    end 

end 

例DB: enter image description here

答えて

0

これに対する答えは、単純にidをdbに追加することでした。私は確信していない、なぜそれが...

関連する問題