64

レール 3.2.1

ActiveRecord のハッシュ構文を使用して演算子を構築する方法 ( s​​queel!=なし) はありますか?

何かのようなものProduct.where(id: !params[:id])

生成するSELECT products.* FROM products WHERE id != 5

の反対を探しますProduct.where(id: params[:id])

アップデート

Rails 4にはnot演算子があります。

Product.where.not(id: params[:id])

4

4 に答える 4

88

以下を使用できます

Product.where('id != ?', params[:id])

クエリをパラメータ化しながら、探しているものを生成します。

Rails 4 では、not 句をサポートするために次の構文が追加されました。

Product.where.not(id: params[:id])

チェーンを使用して複数の句を追加...

Product.where.not(id: params[:id]).where.not(category_id: params[:cat_id])
于 2012-08-29T19:16:24.240 に答える
34

これを行うための組み込みの方法はありません(Rails 3.2.13以降)。ただし、次のような方法を簡単に作成できます。

ActiveRecord::Base.class_eval do
  def self.where_not(opts)
    params = []        
    sql = opts.map{|k, v| params << v; "#{quoted_table_name}.#{quote_column_name k} != ?"}.join(' AND ')
    where(sql, *params)
  end
end

そして、あなたは次のことができます:

Product.where_not(id: params[:id])

アップデート

@DanMclainが答えたように、これはRails 4ですでに実行されています(を使用where.not(...))。

于 2012-08-29T19:16:26.710 に答える
13

Arelはあなたが探求したいと思うかもしれないものかもしれません.Rails 3+ に含まれていると思います.

ここでArelを使用してそれを行う方法

Product.where(Product.arel_table[:id].not_eq(params[:id]))

Product.where(Product.arel_table[:id].not_eq(params[:id])).to_sql 

以下のようなSQLを生成します

SELECT `products`.* FROM `products`  WHERE (`products`.`id` != 1)

このヘルプを願っています

于 2012-08-30T17:08:08.790 に答える