【问题标题】:Fetching models along with corresponding join-models attributes获取模型以及相应的连接模型属性
【发布时间】:2011-12-16 10:44:52
【问题描述】:

我有模型:

class Exam < AR::Base
  has_many :questions_in_exams
  has_many :questions, :through => :questions_in_exams
end

class QuestionsInExam < AR::Base
  belongs_to :examination
  belongs_to :question
  # This model also has a "question_index" attribute
end

class Question < AR::Base
  has_many :questions_in_exams
  has_many :examinations, :through => :questions_in_exams
end

给定一个考试实例,我想获取它的所有问题以及额外的问题 来自连接模型的属性(如“question_index”)。我怎样才能做到这一点?

如果我这样做:

e = Examination.find(1)
questions = e.questions

那么问题数组中的元素将没有“question_index”属性

我想我会写:

e = Examination.find(1)
questions = e.questions_in_exam(:include => "question")

但这似乎不太优雅,因为我需要的大部分数据都在 Question 模型上, 但返回的数组将包含 QuestionInExam 实例。

有什么想法吗?

谢谢

【问题讨论】:

  • include 将为每个Question 获取QuestionInExam 模型,因此您然后调用qe.question 以获取问题属性。区别仅在于数据的延迟或贪婪加载。在包含的情况下,您最多可以获得 2 个对数据库的查询。

标签: ruby-on-rails activerecord has-many-through


【解决方案1】:

从 Question 模型开始,类似这样

Question.select("questions.*, examination.id")
        .joins(:questions_in_exam => :examination)
        .where("examinations.id=?", 1) 

# Note that inside "select" you can specified all the attributes you want from any of the joined models.

一旦您对查询感到满意,请将其转换为 scope

您的最终通话可能如下所示:Question.for_exam(1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多