寻找匹配Tindr风格 - 将2个用户组合在一起,可以批准或拒绝匹配

时间:2016-01-06 17:48:36

标签: postgresql activerecord

我正在建立一个通过Users模型相互匹配Approval的约会网站,并按ranking值进行过滤。

可以为任何Approval对创建Users。下面的代码最初有效,但它有一个严重的缺陷:它只找到第一个N可能的匹配项,其中NUser#potential_matches方法的第一行中为20。

从此潜在匹配列表中,我排除了已Approvalsmatched的所有denied_at

我正在寻找一种有效的方法来查找Users的匹配项。

我可以从用户ID 1开始并迭代 - 但这非常低效。

理想情况下,我希望根据Approval过滤User.id模型 - 如果有Approval user_id的{​​{1}} 10和非零user1_approval值不应显示给用户ID 10. 将显示给具有approved_id的用户。

user_id&之间的差异approved_id只是与2个不同的用户配对。在Approval.user_approval创建之前,它们按名称排序。

如何有效地将UsersApproval模型配对?

class Approval < ActiveRecord::Base
    belongs_to :user
    belongs_to :approved, class_name: "User"

    def self.user_approval(user1, user2)
        sorted = [user1, user2].sort_by { |u| u.name}
        Approval.find_or_create_by(user: sorted[0], approved: sorted[1])
    end

架构:

create_table "approvals", force: :cascade do |t|
    t.integer  "user_id"
    t.integer  "approved_id"
    t.datetime "created_at",         null: false
    t.datetime "updated_at",         null: false
    t.datetime "user1_approval"
    t.datetime "user2_approval"
    t.datetime "denied_at"
    t.boolean  "approved"
    t.boolean  "matched"
  end


User.rb:

  def self.potential_matches(user)
    users = user.where('ranking >= ? AND ranking <= ? AND id != ?', user.lowest_eligible_ranking ,
                                                   user.maximum_eligible_ranking,
                                                   user.id).limit(20)
    approvals = []
    users.each do |s|
      approvals.push(Approval.user_approval(user, s))
    end

    approvals.reject! { |a| a.denied_at != nil}
    approvals.reject! { |a| a.matched == true}

    approvals
  end

2 个答案:

答案 0 :(得分:0)

赦免显而易见的但是除了限制做了什么吗?

users = user.where('ranking >= ? AND ranking <= ? AND id != ?', user.lowest_eligible_ranking, user.maximum_eligible_ranking, user.id).limit(20)

users = user.where('ranking >= ? AND ranking <= ? AND id != ?', user.lowest_eligible_ranking, user.maximum_eligible_ranking, user.id)

答案 1 :(得分:0)

解决方案是废弃Approval模型并使用Decision模型 - 每次“投票”批准或拒绝一个模型。

它使查找更容易。