如何在 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_accepted
和 friend_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
我目前正在从事一个类似于 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_accepted
和 friend_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