gpt4 book ai didi

ruby-on-rails - 用户的 Postgres 架构 & 批准约会风格应用程序的用户

转载 作者:行者123 更新时间:2023-11-29 11:45:12 25 4
gpt4 key购买 nike

用户查看其他用户的个人资料并标记批准拒绝,如 Tinder 或类似的约会应用程序。

我正在构建一个后端带有 ActiveRecord 和 PostgreSQL 的 Rails 服务器。

我正在考虑拥有一个User 模型,然后是一个具有user_idapproved_idApproval 模型。

批准:

  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"
end


class User

has_many :approvals
has_many :approved, through: :approvals
has_many :inverse_users, class_name: "Approval", foreign_key: "approved_id"
has_many :inverse_approvals, through: :inverse_users, source: :user

class Approval

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

这具有限制 Approval 对象数量的优势 - 每对 User 对象只有 1 个。但是,我不确定如何有效地查询此架构。

例如,在查找approvereject 操作时,我必须手动检查提交的user_id 是否与user_id 匹配approved_id 以适本地设置 user1_approvaluser2_approval

我正在考虑通过一个简单的过滤器(年龄范围在 10 年以内)查找用户

所以在 User 中我有:

def self.eligible(user) 
users = User.where('age >= ? AND age <= ? AND id != ?', user.lowest_eligible_age,user.maximum_eligible_age, user.id).limit(20)

approvals = []
users.each do |u|
approvals.push(Approval.user_approval(user, u ))
end

approvals.reject! { |a| a.denied_at}

approvals

end

这对于获取符合条件的用户的候选名单非常有用。它还具有允许 /approvals/:id/approve & /approvals/:id/reject 的 api 的优点。

我想知道使用像 /users/:id/approve 这样的 API 是否更有意义,然后让该操作相应地生成 Approval。每个 Approval 对象都有一个 user_id 和一个 related_approval_id 所以它可以链接到一个相互的 Approval (其中目标用户与链接批准的 user_id 相同)。

  create_table "approvals", force: :cascade do |t|
t.integer "user_id"
t.integer "approved_id"
t.integer "related_approval_id"

这样做会在数据库中产生更多的行。

我希望这是有道理的。我正在寻找一个好的架构解决方案来解决用户相互批准和拒绝的问题,这样我就可以进行良好的查询,比如只显示 User 哪些 current_user 没有批准,哪些没有拒绝当前用户。

最佳答案

因为用户可以在 Tinder 中被“批准”或“拒绝”,所以将此模型称为决策更有意义。这就是我的看法。

用户模型

create_table "users", force: :cascade do |t|
t.integer "id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "age"
...etc...
end

用户模型表示将对另一个用户做出决定或另一个用户将对另一个用户做出决定的应用程序的任何用户。

决策模型

create_table "decision", force: :cascade do |t|
t.integer "id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "decision_maker_id"
t.integer "decision_receiver_id"
t.boolean "approved"
t.boolean "active"
...etc...
end

决策代表用户之间的任何交互。在用户身上向右滑动是一个决定。来自对方用户的响应滑动是另一个决定。这不是表示为一个完整的对象,而是表示为两个单独的“决策”交互。

让我解释一下 Decision 中的字段的含义:

  • decision_maker_id - 刷卡用户的 ID
  • decision_receiver_id - 接收刷卡的用户 ID
  • approved - 一个 bool 值,如果向右滑动则为真,如果向左滑动则为假
  • active - 一个 bool 值,用于确定此决定是否已经有回复决定

决策模型中,您需要一个 before_save 回调来检查正在保存的决策是否已经有对应的回复决策。如果是这样,那么您可能希望决定不再有效,这样它就不会再出现在提要中。然后,您可以通知用户他们同意/不同意,或者在您的应用中此时您希望做的任何事情。

before_save: check_for_existing_reply

def check_for_existing_reply
# if there is a decision object with this decision_maker_id and this
# decision_receiver_id but in opposite fields then you know there is a reply
# and you can take some action here
end

用户模型中,您可以编写方法来查找所有存在的事件批准/拒绝。

scope :decisions, -> (id, approval_type) { where('decision_receiver_id = ? AND approved = ? AND active = true', approval_type) }  

通过使用 User.decisions(user_id, true) 调用该范围,您可以获得用户的所有批准。通过使用 user.decisions(user_id, false) 调用该范围,您可以获得用户的所有拒绝。

您也可以将其分为两个独立的范围,一个用于批准,一个用于拒绝。

scope :approvals, -> (id) { where('decision_receiver_id = ? AND approved = ? AND active = true', true) } 
scope :rejections, -> (id) { where('decision_receiver_id = ? AND approved = ? AND active = true', false) }

最后,您可以将其设为在 User 实例上调用的方法,这样您就不必传入 id 参数。

# where decision = true would mean approvals and decision = false would mean rejections  
def get_decisions(decision)
return User.where('decision_receiver_id = self.id AND approved = decision AND active = true') }
end

您可以在 User 的实例上调用它,例如 user.get_decisions(true)

关于ruby-on-rails - 用户的 Postgres 架构 & 批准约会风格应用程序的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31259021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com