63 votes

Requête Rails ActiveRecord pour Pas égal

Rails 3.2.1

Existe-t-il un moyen (sans squeel ) d'utiliser la syntaxe de hachage de ActiveRecord pour construire un opérateur != ?

Quelque chose comme Product.where(id: !params[:id])

Génère SELECT products.* FROM products WHERE id != 5

Vous recherchez le contraire de Product.where(id: params[:id])

METTRE À JOUR

Dans les rails 4, il existe un opérateur not .

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

85voto

Dan McClain Points 7036

Vous pouvez utiliser ce qui suit

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

Ce qui va générer ce que vous recherchez, tout en paramétrant la requête.

Avec Rails 4, la syntaxe suivante a été ajoutée pour prendre en charge les clauses non

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

34voto

PinnyM Points 23998

Il n'y a pas de moyen intégré de faire cela (à partir de Rails 3.2.13). Cependant, vous pouvez facilement créer une méthode pour vous aider:

 class ActiveRecord::Base
  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
def
 

Et alors vous pouvez faire:

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

METTRE À JOUR

Comme @DanMclain a répondu - cela est déjà fait pour vous dans Rails 4 (avec where.not(...) ).

24voto

boulder_ruby Points 6257

Rails 4 a ceci compris. Alors peut-être que vous pourriez simplement mettre à jour votre application rails

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

13voto

Viren Points 2779

Arel pourrait celui que vous pourriez explorer Il est inclus dans Rails 3+, je suppose

Voici comment vous le faites en utilisant Arel

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

et

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

générerait SQL comme ci-dessous

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

J'espère que cette aide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X