如何在 rails activerecord 关系中加入 "matching feature"

How do I incorporate a "matching feature" in rails activerecord relationship

我目前正在从事一个类似于 Tinder 等约会应用程序的项目。一个用户(在我的程序中名为 Owner)在其他所有者上滑动,如果他们都在彼此上滑动,则会创建“匹配”。我一直在寻找解决方案,例如类似于 Facebook 好友的好友请求。我看到人们使用布尔值默认为 false 的“已确认”列并将其更改为 true,但我无法弄清楚其中的逻辑。任何关于如何实现这一点的建议将不胜感激。我在这方面的唯一经验是关注或关注不需要相互请求才能完成的关注者。

所有者class:(用户)

class Owner < ApplicationRecord
    has_many :matches
    has_many :friends, :through => :matches

 end

匹配class:

class Match < ApplicationRecord
    belongs_to :owner
    belongs_to :friend, :class_name => "Owner"
end

感谢您的帮助!自连接对我来说是一个复杂的话题。

您可以向联接中添加更多字段 table。您可以添加 owner_acceptedfriend_accepted 之类的内容。虽然我觉得一个 accepted 字段就够了。 示例解决方案:

class AddAcceptedToMatches < ActiveRecord::Migration[6.0]
  def change
    add_column :matches, :accepted, :boolean, default: false
  end
end

class Owner < ApplicationRecord
  has_many :matches
  has_many :friends, :through => :matches

  def send_request_to(friend)
    friends << friend
  end

  def accept_request_from(owner)
    matches.find_by(owner_id: owner.id).accept
  end

  def is_friends_with?(stranger)
    match = matches.find_by(friend_id: stranger.id)
    return false unless match
    match.accepted?
end

class Match < ApplicationRecord
  belongs_to :owner
  belongs_to :friend, :class_name => "Owner"

  def accept
    update(accepted: true)
  end
end

然后你可以这样做:

owner = Owner.new
friend = Owner.new

owner.send_request_to(friend)
owner.is_friends_with?(friend)
# false
friend.accept_request_from(owner)
owner.is_friends_with?(friend)
# true