gpt4 book ai didi

ruby-on-rails - DatingApp编程: ActiveRecord association for finding Users where there are no Approvals or one 1 way approvals

转载 作者:行者123 更新时间:2023-11-29 11:17:49 24 4
gpt4 key购买 nike

我正在构建一个约会风格的应用程序,其中 User 可以批准其他用户。我使用 Approval 模型来跟踪这些关系。每个 Approval 都有一个 user_id 和一个 approved_id -- 已批准的 User 的用户 ID。它还具有 rejected_at,一个指示一个 User 已拒绝另一个的日期时间。

要向 current_user 显示符合条件的用户,我必须查询存在其中之一的用户

  • 批准关系
  • Approval 仅与 approved_idcurrent_user.id 的关系(意味着符合条件的用户批准 current_user 但没有其他方式的关系周围
  • 排除具有 Approval 和非零 rejected_at 属性的 User,其中 approved_idUseruser_idcurrent_user

我如何制作 ActiveRecord 查询来查找符合条件的用户?我知道我可以在 Approval 上执行 joins 但我也想说明 User 之间没有 Approval 关系>s!我认为只进行 2 个单独的查询可能更有意义,但我想知道是否可以合并为一个查询..

最佳答案

您想要的行为是 LEFT OUTER JOIN ,其中将包括来自 users 的行approvals 中是否有匹配行.这样,您将获得 User没有发出 Approval关于你的目标 User ,或者一个拥有并且我们可以过滤拒绝的人。

The query看起来像

-- Looking for users who either have no opinion or have approved user 1
SELECT *
FROM users
LEFT OUTER JOIN approvals
ON users.id = approvals.user_id
AND approvals.approved_id = 1 -- Filter for only approvals of user 1
WHERE users.id != 1 -- Ignore user 1
AND (
approvals.approved_id IS NULL -- Approving user has no opinion of user 1
OR approvals.rejected_at IS NULL -- Approving user has not rejected user 1
)
;

分片,

  • users LEFT OUTER JOIN approvals考虑所有users , 即使他们没有 approvals
  • ON users.id = approvals.user_idusersapprovals他们创造了
  • ON ... AND approvals.approved_id = 1只考虑 approvals对于 User 1
  • WHERE users.id != 1只考虑其他 users
  • WHERE ... approvals.approved_id IS NULL需要 users 没有创建任何 approvals关于 User 1 .
  • WHERE ... approvals.rejected_at IS NULL需要 users 确实创造了一个Approval对于 User 1 , 这不是拒绝

ActiveRecord当我们翻译这个时并没有做任何特别漂亮的事情,但它有效:

class User < ActiveRecord::Base
def eligible_partners
User.joins( # Join like we did before
<<-SQL
LEFT OUTER JOIN approvals
ON users.id = approvals.user_id
AND approvals.approved_id = #{self.id}
SQL
).where.not(id: id) # Ignore ourselves
.where( # Filter for no approvals or a positive approval
<<-SQL
approvals.approved_id IS NULL
OR approvals.rejected_at IS NULL
SQL
)
end
end

如果你想要更易读的东西,你可以收集每个 User 的 ID已经拒绝给定的人,然后得到所有其他人 User秒。一方面,这是两个查询;另一方面,它可能比 JOIN 便宜一旦您的表格变大,它就更容易理解。

  def other_eligible_partners
rejecter_ids = Approval
.where(approved_id: id) # About ourselves
.where.not(rejected_at: nil) # Rejected us
.pluck(:user_id)
User.where.not(id: rejecter_ids + [id]) # People who didn't reject us
end

关于ruby-on-rails - DatingApp编程: ActiveRecord association for finding Users where there are no Approvals or one 1 way approvals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31277499/

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