我正在建立一个Users
通过Approval
模型相互匹配的约会网站,并按ranking
值进行过滤。
Approval
可以为任意一对创建1 Users
。下面的代码最初可以工作,但是有一个严重的缺陷:它只找到第一个N
可能的匹配项,方法N
的第一行是20 User#potential_matches
。
在此潜在匹配项列表中,我排除Approvals
了已经matched
或的任何项denied_at
。
我正在寻找找到匹配项的有效方法Users
。
我可以从用户ID 1开始并进行迭代-但这效率很低。
理想情况下,我想Approval
基于User.id
-过滤模型-如果存在Approval
带有user_id
10且非零user1_approval
值的,则不应将其显示给用户ID10。将为用户显示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
解决的办法是取消Approval
模型并改用Decision
模型-批准或拒绝的“票数”为一个。
它使查找更加容易。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句