Ruby on rails Rails u用户之友关系

Ruby on rails Rails u用户之友关系,ruby-on-rails,ruby,associations,model-associations,self-reference,Ruby On Rails,Ruby,Associations,Model Associations,Self Reference,我正在创建一个RoR模拟facebook,用户可以将彼此添加为好友。我很难从友谊的一个方面理解朋友关系。例如,我有一个用户“Ben”,他添加了用户“Jordan”。此操作通过下面的友谊控制器执行 def create @friendship = current_user.friendships.build(friend_id: params[:friend_id], confirmed: false) if @friendship.save

我正在创建一个RoR模拟facebook,用户可以将彼此添加为好友。我很难从友谊的一个方面理解朋友关系。例如,我有一个用户“Ben”,他添加了用户“Jordan”。此操作通过下面的友谊控制器执行

    def create
        @friendship = current_user.friendships.build(friend_id: params[:friend_id], confirmed: false)
        if @friendship.save
            flash[:notice] = "Friend Request Sent."
            redirect_to root_url
        else
            flash[:notice] = "Unable to send friend request."
            redirect_to root_url
        end
    end
下面的用户模型有一些方法可以帮助我访问每个用户的信息。
在rails控制台中,在我接受好友请求后,我搜索每个用户的好友。在rails控制台中将
ben
指定为ben用户对象,并将
jordan
指定为jordan用户对象后,我查找
ben.friends\u列表
ben.friends
,jordan同时显示这两个对象。但是当我查找jordan.friends\u列表和jordan.friends时,我得到一个空白数组和空白活动记录关联

当我查到他们之间存在的友谊,那是本加上乔丹时建立的,它说他们之间存在着友谊。(本的ID=4,乔丹的ID=3)

我认为问题可能在我的关联中,或者在我的用户的模型方法中。任何帮助都将不胜感激

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  
  has_many :friendships, dependent: :destroy
  has_many :friends, through: :friendships
  has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
  has_many :inverse_friends, through: :inverse_friendships, source: :user
  has_many :posts, dependent: :destroy
  has_many :comments, dependent: :destroy

  def friends_list
    friends_array = friendships.map{|friendship| friendship.friend if friendship.confirmed}
    friends_array + inverse_friendships.map{|friendship| friendship.user if friendship.confirmed}
    friends_array.compact
  end

  #users who haven't accepted friend request
  def pending_friends
    friendships.map{|friendship| friendship.friend if !friendship.confirmed}.compact
  end

  #users who have requested to be friends
  def friend_requests
    inverse_friendships.map{|friendship| friendship.user if !friendship.confirmed}.compact
  end

  def confirm_friend(user)
    friendship = inverse_friendships.find{|friendship| friendship.user == user}
    friendship.confirmed = true
    friendship.save
  end

  def friend?(user)
    friends_list.include?(user)
  end
end
class用户“友谊”;:外键=>“朋友id”
拥有很多:反向朋友,通过::反向朋友,来源::用户
有很多:帖子,依赖::销毁
有很多:注释,依赖::销毁
def好友列表
friends|array=friendships.map{| friends | friends.friend if friends.confirm}
friends_数组+inverse_friendships.map{| friends | friends.user if friends.confirm}
friends\u array.compact
结束
#尚未接受好友请求的用户
你的朋友
友谊。地图{|友谊|友谊。朋友如果!友谊。确认}。契约
结束
#请求成为好友的用户
def friend_请求
反向|友谊.映射{|友谊|友谊.用户if!友谊.确认}.压缩
结束
def确认朋友(用户)
友谊=反向友谊。查找{友谊{友谊。用户==用户}
友谊
友谊,拯救
结束
def朋友?(用户)
好友列表。包括?(用户)
结束
结束

你好,希望我的回答能帮助你 我个人建议您使用基于查询的方法,因为它比使用Ruby自己的方法快得多,效率也高:因此,例如,为了获得友谊请求,您可以使用范围(模型方法)
有很多:友情请求,lambda{| user | unscope(where::user|id)。where(“状态='Pending'))。where('friendships.user|id=:user|id=:user|id',user|id:user.id)},class|u name:'friendships'

此范围将为您提供用户id(发送方)或其他用户id(接收方)状态是否处于挂起状态。因此,为了获得朋友,您将应用相同的方法,但不同的是状态现在处于活动状态,它将如下所示:


有_many:friends,lambda{| user | unscope(where::user|id)。where(“status='Active')。where('friendships.user|id=:user|id=:user|id',user|id:user.id)},class\u name:“friends”
两个查询都是相同的,但主要区别在于状态

虽然我不能立即提供建议,但根据您的描述,
反向朋友
和/或
反向朋友
似乎有问题(与您的想法一致)。jordan.inverse\u friends.to\u sql产生了什么?这是你所期望的吗?
jordan.friends
我希望是空的,因为友谊关系是Ben->jordan。从这个意义上说,
.friends
只会显示用户亲自发起的友谊。问题可能与你的
反向友谊有关。我会努力复制的。啊,不用管那些联想。当您使用
+
连接数组时,它不会改变原始数组,因此在
好友列表中,您将反向好友连接到
好友数组
,然后不使用结果。您可以使用
friends\u list.concat
进行破坏性追加。话虽如此,让数据库为您完成这项工作并使用查询来生成已确认朋友的列表将更加高效?友谊模式有什么联系?