class QuestionGroup < ActiveRecord::Base
has_many :questions
end
class Question < ActiveRecord::Base
belongs_to :question_group
has_many :question_answers
has_many :question_users_answers, :through => :question_answers, :source => :user_question_answers
def self.questions_without_answers(user_id)
select {|q| q.question_users_answers.where(:user_id=>user_id).empty?}
end
end
class QuestionAnswer < ActiveRecord::Base
belongs_to :question
has_many :user_question_answers
end
我需要找到所有问题,如果他们没有用户答案我是按类方法 self.questions_without_answers(user_id)
进行的但是如何找到所有提出问题的问题组_without_answers和特定用户?
P.S:我需要找到所有未回答的问题和所有拥有这些问题的小组,我可以通过查找或命名范围来完成吗?
更新:
def self.groups_without_answers(user_id)
questions_ids = Question.questions_without_answers(user_id).map {|q| q.id}
all(:conditions => "id in (select distinct question_group_id from questions where id in (#{questions_ids.join(',')}))")
end
但我认为这不好或者我错了?
答案 0 :(得分:0)
class QuestionGroup < ActiveRecord::Base
has_many :questions
def self.without_answers(user_id)
joins(%"inner join questions on question_groups.id = questions.question_group_id
inner join question_answers
on question_answers.question_id = questions.id
inner join question_groups
on question_answers.question_users_answers_id = question_users_answers.id").where("user_question_answers.user_id" => user_id).select { |qq| ... }
end
end
end
您可以将某些内部联接更改为省略联接以获取您要加入的表没有匹配项的记录,例如无法回答的情况。您要加入的表的字段将具有所有字段的NULL值。添加where id为null 甚至可以过滤到没有答案的问题。
请记住,这只是一种替代技术。您可以通过以下方式以编程方式解决问题:
class QuestionGroup
def self.question_groups_without_answers(user_id)
select {|qq| qq.question_users_answers.where(:user_id=>user_id).empty?}.map{ |qq| qq.question_group }
end
end
执行连接的一个优点是数据库可以完成所有工作,并且您不会向数据库发送多个SQL查询,因此它可以更多更快。