Запрос 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])
Ответы
Ответ 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)
Надеемся на эту помощь