我正在尝试使用ActiveRecord和/或SQL找到补充。
我有一组'注释',每个都有两个相关的字段:
每个post_id可能有多个注释。
我想有效地找到满足两个约束的注释:
这是一个非常天真的版本,可以在DB之外进行连接。它查找此用户已执行的所有注释,并从仍需要执行的详尽注释列表中删除这些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?
答案 0 :(得分:1)
SELECT a1.*
FROM annotations AS a1
JOIN annotations AS a2
ON a1.post_id=a2.post_id
WHERE a2.session_datum_id=session_datum AND a1.session_datum_id IS NULL