1

我正在尝试为我制作的测验管理员制作一个 API。

我有一个测验模型,它有_many 问题和has_many 结果问题模型也有_many 答案

我希望 url/data/quiz/7将所有问题+答案和结果返回到 id=7 的测验

这是我目前的方法。

def quiz
    @quiz = Quiz.find(params[:id])

    @questions = @quiz.questions.select('id, content') # returns only selected fields
    @results = @quiz.results.select('id, content, points_limit') # returns only selected fields

    @questions.each do |question|
        question['answers'] = question.answers.select('id, content, points') #returns whole object
    end

    @return = Hash.new
    @return['questions'] = @questions
    @return['results'] = @results

    respond_to do |format|
        format.json { render json: @return }
        format.xml { render xml: @return }
    end
end

一切正常,除了答案返回完整的答案对象,包括created-at、id、updated-at 等,我想要的只是查询中选择的字段,就像我拥有的​​一样。

为什么 .select 适用于 @questions 和 @results 而不是关联的 @answers?

无论我尝试什么,它似乎都忽略了答案循环的选择语句并总是返回完整的对象。

--

在控制台中......我知道做同样的事情

question.answers.select('id, content, points')

返回正是我所追求的。所以这与我将它放入数组/哈希的方式有关,我猜想但仍然无法解决。

4

1 回答 1

2

我想如果你尝试这样的事情,它会起作用:

@answers = Answer.select([:id, :content, :points])
                 .where(question_id: @questions.pluck(:id))

这与以下内容相同:

SELECT id, content, points
FROM answers
WHERE question_id in (<question_ids array>)
于 2012-07-22T07:28:54.710 回答