2017-09-11 3 views
0

私はAnswerのオブジェクトを配列したサービスを持っています。各オブジェクトには、回答テキストの文字列と、正しい答えかどうかを示すブール値とIDが含まれています。これまでのコードです:Rails - 配列内のすべてのオブジェクトのいくつかの属性しか取得できませんか?

@quiz.questions[current_question_index].answers 

これは機能します。次に、この配列の回答オブジェクトをActionCableチャンネルに送ってボタンとして表示します。これも機能します。

しかし、今、私は(正しい答えの情報を含む)全体Answerオブジェクトを送信しない方が良いだろうと思っていますが、唯一のIDとタイトルが私はthis postに応じて自分のコードを変更しようとしました:

@quiz.questions[current_question_index].answers.pluck(:id, :title) 

これは私のためには機能しません - 私のすべてのボタンは "未定義"となりました。だから私はそれをthis postに応じて別の方法を試してみました:

@quiz.questions[current_question_index].answers.attributes.slice('id', 'title') 

今私のボタンがさえもう表示されません...私が欲しいもの

は、属性「ID」を含むオブジェクトの配列であり、私の検索されたAnswersから 'タイトル'。

誰でも私にこれを解決するためのポインタを教えてもらえますか?私はRailsの初心者であり、本当に助けに感謝します。

答えて

1

あなたが言ったようにanswersが配列され、かつpluck方法は、(それがAR magicです)アレイ上

そしておそらく修正して、あなたのボタンは、あなたが回答オブジェクトの配列を持っていたので、前に表示され停止し利用できません、今度は鍵付きのハッシュの配列があります:idtitleです。

ブラウザのインス​​ペクタ(ChromeのF11)を確認して、どのような種類のJavascriptエラーが発生しているかを確認し、それに応じて修正する必要があります。

フルオブジェクトの代わりにハッシュを送信することをお勧めします。受信側で使用する方法を変更するだけで済みます。

編集:

についての属性は、あなたはそれはあなたが期待する効果があります。この

@quiz.questions[current_question_index]. 
    answers.map{|answer| answer.attributes.slice('id', 'title') 

ような何かをする必要があります。

"Rails magic"について。私はこれがどういう意味だったのですか?Railsは最後の瞬間までクエリを呼び出さず、アクティブなレコードメソッド(pluck)を呼び出すことができるオブジェクトAnswer::ActiveRecord_Relationを持っています。

Answersの配列を作成し、配列にpluckを呼び出すことはできません。定義されていません。

私はそれが今より明確になることを願っています。

+0

[OK]を感謝します。だから私は再びスライスを使用しようとし、それは私に '属性'のためのNoMethodErrorを与えます:/私は他のStackoverflowの記事を読むとき '属性'がRailsヘルパーだと思っています。 ... – megahra

+0

また、_AR magic_とは何ですか? :)私はリンクをチェックしましたが、違いが何であり、なぜそれが配列で利用できないのか分かりません。 – megahra

+0

私は私の答えを更新しました。見てください – meta

1
question = @quiz.questions[current_question_index] 
answers = question.answers.map { |a| a.attributes.slice('id', 'title') } 

#attributesあなたは配列またはコレクションにそれを呼び出すことはできませんので、モデルインスタンスのメソッドです。それは文字列キーを持つハッシュを返します。あなたが摘む(配列の配列)と同じ出力したい場合は

Answer.first.attributes 
=> { id: 1, title: 'foo' } 

その後、使用:

.slice('id', 'title').values 

しかし(JS/JSON内のオブジェクトにマップ)ハッシュを使用して、より良い代替手段です。

#pluckは、SELECT foo, bar FROM bazクエリを作成して配列の配列を返すため、コレクションまたはスコープで機能するActiveRecordメソッドです。例えば

:説明@metaため

Question.find(1).answers.pluck('id', 'title') 
=> [[1, 'foo'], [2, 'bar']] 
+0

また、ActiveModel :: SerializersまたはjBuilderを使用してモデルからJSONを作成することができます。 – max

関連する問題