【问题标题】:ActiveRecord query to load models, and conditionally their childrenActiveRecord 查询以加载模型,并有条件地加载它们的孩子
【发布时间】:2020-06-15 17:41:11
【问题描述】:

我有一个Question 模型和一个Answer 模型。 Answerbelongs_toQuestion 并有一个date 列。

我正在制作“给定日期的答案”页面。我正在尝试显示所有Questions,并为每个人显示他们拥有的任何答案,其中“答案”。“日期”是给定的日期。

我尝试过的

    @questions = Question.includes(:answers).
                          where('answers.date = ?', params[:date]).
                          references(:answers)

当我这样做时,它不会加载该日期没有任何答案的问题。如果我将includes 替换为left_joins,则相同。

我的工作(但效率低下)解决方案

获得所有问题,并获得所需日期的所有答案

    @questions = Question.all.to_a
    @answers = Answer.where(date: params[:date]).to_a

然后对于每个问题,我搜索@answers 数组

@questions.each do |question|
  current_answers = @answers.select { |a| a.question_id == question.id }
  # render stuff
end

由于我的问题永远不会超过几百个,因此我并不十分关心这个解决方案,但我想要一个比一遍又一遍地搜索数组更优雅的选择。

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    如果你需要显示所有问题,我认为你不需要添加

    where('answers.date = ?', params[:date])
    

    在您的代码中,因为它不会加载该日期没有任何答案的问题。


    为了显示答案,我认为你可以这样做

    @questions.first.answers.where(date: params[:date]).first
    

    【讨论】:

    • 不会应用 where 使其对数据库进行另一个查询吗?
    • 因为我们已经迫不及待地加载了关系,我认为它不会做另一个查询
    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 2014-08-31
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多