我有一个非常标准的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
(好奇:只要只有一个用户标记问题已解决,此方法就可以正常工作。只要添加一秒,每个用户就会开始只返回其他用户已解决的问题,而不是那些没有自己解决的人。)
答案 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)])