我正在尝试使用 ActiveRecord 和/或 SQL 来寻找补充。
我有一个“注释”集合,每个注释都有两个相关字段:
- session_datum_id 对应于执行注释的用户。Null 表示尚未完成。
- post_id 表示注释为“关于”的帖子。不能为空。
每个 post_id 可能有多个注释。
我想有效地找到满足两个约束的注释:
- session_datum_id 为空。这意味着尚未执行此特定注释。
- 作为 arg 传入的 session_datum 尚未执行具有相同 post_id 的另一个注释。
这是一个非常幼稚的版本,它在数据库之外进行连接。它会找到该用户已经执行的所有注释,并从仍然需要执行的完整注释列表中删除这些 post_id。然后它从结果列表中随机选择:
def self.random_empty_unseen(session_datum)
mine = where('session_datum_id = ?', session_datum)
elligible = where('session_datum_id IS NULL')
mine.each do |i|
elligible.each do |j|
if (i.post_id == j.post_id)
elligible.delete(j)
end
end
end
elligible[rand(elligible.count)]
end
随着注释列表变大,这将陷入困境。我可以想象一个概率算法,我们随机选择一个符合条件的注释,然后检查用户是否已经执行了它(如果是,则重试),但在某些退化的情况下它不起作用。(大量注释,用户执行了所有注释,但其中一个除外。)
是否有对此的封闭式查询,可能使用 NOT EXISTS?