查询关联表中没有匹配ID的行

时间:2011-11-27 22:00:34

标签: sql ruby-on-rails activerecord

我有一个非常标准的app,由一个SQL数据库支持,其中包含User模型,Problem模型和CompletedProblem模型,它们充当两者之间的连接表。

我正在尝试创建一个返回特定用户未解决的所有问题的方法。然而,我遇到了一堵墙,我希望能指出我的方法应该是什么样的。

以下是模型以及创建此方法时的最新(不正确)传递。

class User < ActiveRecord::Base
  has_many :completed_problems
  has_many :problems, :through => :completed_problems

  def unsolved_problems
    Problem.includes({:wall => :gym}, :completed_problems).
      where('completed_problems.user_id != ? OR completed_problems.user_id IS NULL)', self.id)
  end
end

class Problem < ActiveRecord::Base
  has_many :completed_problems
  has_many :users, :through => :completed_problems
end

class CompletedProblem < ActiveRecord::Base
  belongs_to :user
  belongs_to :problem
end

(好奇:只要只有一个用户标记问题已解决,此方法就可以正常工作。只要添加一秒,每个用户就会开始只返回其他用户已解决的问题,而不是那些没有自己解决的人。)

2 个答案:

答案 0 :(得分:1)

通过朋友:

select * from problems where id not in (select problem_id from completed_problems where user_id = USER_ID))

虽然我仍然有兴趣听听ActiveRecord是否有办法做到这一点。

答案 1 :(得分:0)

我认为这样的事情会这样做:

Problem.where(["id NOT IN (?)", self.problems.all.map(&:id)])