按特定条件查找所有关联对象

时间:2012-09-27 15:39:42

标签: ruby-on-rails ruby find associations named-scope


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

但我认为这不好或者我错了?

1 个答案:

答案 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查询,因此它可以更多更快。