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: