2

これは私のコントローラのステートメントを1行に書く正しい方法を理解できません。正しい値の配列を持つステートメントを書く方法

私はここで何が欠けていますか?

@food_ranks = FoodRank.where("user_id = ? AND rank = ?", current_user.id, [0, 1, 2]) 

ここでは、3行で記述しようとしています。

@food_ranks = Array.new(FoodRank.where("user_id = #{current_user.id} AND rank = 0")) 
@food_ranks << FoodRank.where("user_id = #{current_user.id} AND rank = 1") 
@food_ranks << FoodRank.where("user_id = #{current_user.id} AND rank = 2") 

@food_ranksは、このようなオブジェクトを正しく表示します。なぜこれで私はこれのような何かをさせませんか?

@food_rank each do |rank| 
    rank.user_id 
end 

実際にはどこのステートメントですか?@food_ranksはどこですか? (未定義のメソッド)

答えて

5

この方法を試してみてください:

@food_ranks = FoodRank.where("user_id = ? AND rank IN (?)", current_user.id, [0, 1, 2]) 

あなたはまた、行うことができます。

@food_ranks = FoodRank.where(user_id: current_user.id, rank: [0, 1, 2]) 
+1

トップランクに 'rank IN(?)'と書く必要はありません.Railsによって生成されます。 –

+0

私は、最初のクエリでは、それはまだ必要だと思います。 2番目のものは必要ありません。だから私は2番目のクエリで 'IN'を使わなかったので、Railsは自動的にそれを行います。 –

1

問題は、あなたが配列を渡し、そしてそれにランクを比較しようとしているです。

はそうのようにそれを変更してみてください:

FoodRank.where("user_id = ?", current_user.id, rank: [0, 1, 2]) 

Railsは自動的に、アレイからのSQL文のIN、それを指定するので、必要はありませんが生成されます。

関連する問題