【问题标题】:Find all associated objects by specific condition按特定条件查找所有关联对象
【发布时间】:2012-09-27 15:39:42
【问题描述】:

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)

但是,我如何才能找到所有存在 questions_without_answers 并针对特定用户的 QuestionGroups?

P.S:我需要找到所有未回答的问题以及拥有这些问题的所有组,我可以通过 findnamed-scope 来完成吗?

更新:

  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

但我认为这不好还是我错了?

【问题讨论】:

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


    【解决方案1】:
    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 is 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 查询,因此它可以快得多

    【讨论】:

    • 谢谢,等一下我试试;)
    • 加入工作,但在哪里抛出此异常:Mysql2::Error: Unknown column 'bio_params_groups.user_id'。 user_id 列只知道 user_question_answers 表。
    • 我的回答的问题是我对你在哪里使用选择感到困惑。 Select 可以是一种设置 SQL 选择短语的方法,也可以将关系视为一个数组,并像 Array#select 一样选择元素。您正在获取每个问题对象,对每个问题对象进行数组选择,然后调用关联以使用 where 子句进行查询,并检查结果是否为空。
    • joins 子句可以工作,但它的工作方式完全不同。您可能需要稍微尝试一下,但如果您希望数据库完成工作,则可能需要连接,因为不同类中有多个关联。您可以通过编程方式完成,但您应该能够自己解决。
    • 需要“user_question_answers.user_id”而不是 :user_id。
    猜你喜欢
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    相关资源
    最近更新 更多