我正在建立一个通过Users
模型相互匹配Approval
的约会网站,并按ranking
值进行过滤。
可以为任何Approval
对创建Users
。下面的代码最初有效,但它有一个严重的缺陷:它只找到第一个N
可能的匹配项,其中N
在User#potential_matches
方法的第一行中为20。
从此潜在匹配列表中,我排除了已Approvals
或matched
的所有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
创建之前,它们按名称排序。
如何有效地将Users
与Approval
模型配对?
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
答案 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
模型 - 每次“投票”批准或拒绝一个模型。
它使查找更容易。