ActiveRecord的补充?

时间:2011-10-03 16:20:46

标签: sql ruby activerecord complement

我正在尝试使用ActiveRecord和/或SQL找到补充。

我有一组'注释',每个都有两个相关的字段:

  • session_datum_id,对应于执行该操作的用户 注解。 Null意味着尚未完成。
  • post_id,表示注释为“关于”的帖子。不能 是空的。

每个post_id可能有多个注释。

我想有效地找到满足两个约束的注释:

  1. session_datum_id为null。这意味着尚未执行此特定注释。
  2. 作为arg传入的session_datum尚未使用相同的post_id执行另一个注释。
  3. 这是一个非常天真的版本,可以在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?

1 个答案:

答案 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