1

私が作成したクイズ管理者用の API を作成しようとしています。

has_many Questions と has_many Results の Quiz モデルがあります。Question モデルも has_many Answers です。

/data/quiz/7すべての質問+回答と結果をID = 7のクイズに返すURLが必要です

これが私が現時点で持っているこのための方法です。

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などを含む完全な回答オブジェクトを返すことを除いて、すべてが機能し、必要なのはクエリで選択されたフィールドだけです。

@questions と @results では .select が機能するのに、関連する @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 に答える