数量がゼロではないユーザー製品を取得しようとしています。この方法で製品を取得しようとしましたが、数量に関係なく、そのユーザーに属するすべての製品が得られます。
@user = User.find(params[:id])
@products = @user.products.where(:quantity != 0)
数量がゼロではないユーザー製品を取得しようとしています。この方法で製品を取得しようとしましたが、数量に関係なく、そのユーザーに属するすべての製品が得られます。
@user = User.find(params[:id])
@products = @user.products.where(:quantity != 0)
Active Record は条件を整えるためにあちこちでちょっとした魔法を使っていますが、それでも Ruby であり、それには限界があります。表現
:quantity != 0
は常に に評価されtrue
ます。したがって、コマンドは次のようになります。
@products = @user.products.where( true )
そして、それはあなたの望ましくない結果を説明しています。
必要なクエリをコーディングするには、考えられる構文の 1 つを次のようにする必要があります。
@products = @user.products.where( "quantity != ?", 0 )
SQL where 句を作成する別の方法を使用します。ここでは、プレースホルダー構文 (?
値のリストを使用する) は実際には必要ありませんが、"#{variable}"
SQL インジェクション攻撃に対する脆弱性を軽減するために、Ruby の変数補間 (たとえば ) の代わりに使用する必要があります。