Подтвердить что ты не робот

Запрос Rails ActiveRecord для неравных

Rails 3.2.1

Есть ли способ (без squeel) использовать хэш-синтаксис ActiveRecord для построения оператора !=?

Что-то вроде Product.where(id: !params[:id])

Создает SELECT products.* FROM products WHERE id != 5

Ищем противоположность Product.where(id: params[:id])

UPDATE

В рельсах 4 существует оператор not.

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

4b9b3361

Ответ 1

Нет встроенного способа сделать это (с 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])

UPDATE

Как ответил @DanMclain - это уже сделано для вас в Rails 4 (с помощью where.not(...)).

Ответ 2

Вы можете использовать следующие

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

Что будет генерировать то, что вы ищете, а при параметризации запроса.

С Rails 4 добавлен следующий синтаксис для поддержки не предложений

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

Добавьте несколько предложений с цепочкой...

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

Ответ 3

Rails 4 это выяснилось. Так что, возможно, вы можете просто обновить приложение для рельсов.

Model.where.not(:id => params[:id])

Ответ 4

Arel может тот, который вы, возможно, захотите изучить. Он включен в Rails 3+, я думаю,

Здесь Как вы это делаете, используя Арели

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)

Надеемся на эту помощь