173 votes

Rails : Comment la chaîne étendue interroge avec ou au lieu de AND ?

J’utilise Rails3, ActiveRecord

Je me demandais comment je peux la chaîne les portées avec des instructions d’OR plutôt que « et ».

par exemple

Que normalement retourne nom = « Jean » AND lastname = « Smith », mais je voudrais :

nom = « Jean » OR lastname = « Smith »

124voto

Petros Points 4430

Vous feriez

À l’heure actuelle, il n’est pas n’importe quel autre support OR par la nouvelle syntaxe AR3 (c'est-à-dire sans utiliser certains gem parti 3e).

54voto

Dan McNevin Points 15319

Utilisez ARel

25voto

codenamev Points 420

Dans le cas où quelqu'un est à la recherche d'une mise à jour de répondre à cette question, il semble qu'il y est une pull request à faire entrer ça dans les Rails: https://github.com/rails/rails/pull/9052.

Grâce à @j-mcnally du singe patch pour ActiveRecord (https://gist.github.com/j-mcnally/250eaaceef234dd8971b) vous pouvez effectuer les opérations suivantes:

Person.where(name: 'John').or.where(last_name: 'Smith').all

Encore plus précieux est la capacité de la chaîne d'étendues avec OR:

scope :first_or_last_name, ->(name) { where(name: name.split(' ').first).or.where(last_name: name.split(' ').last) }
scope :parent_last_name, ->(name) { includes(:parents).where(last_name: name) }

Ensuite, vous pouvez rechercher toutes les Personnes avec le prénom ou le nom ou dont le parent avec un nom de famille

Person.first_or_last_name('John Smith').or.parent_last_name('Smith')

Pas le meilleur exemple pour l'utilisation de cela, mais juste essayer de l'adapter avec la question.

22voto

Semyon Perepelitsa Points 7592

Vous pouvez également utiliser MetaWhere gem à n'intervertissez pas votre code avec des trucs SQL :

9voto

dhulihan Points 3321

Ce serait un bon candidat pour MetaWhere si vous utilisez des Rails 3.0 +, mais il ne fonctionne pas sur Rails 3.1. Vous pourriez vouloir essayer squeel plutôt. Elle est faite par le même auteur. Voici comment vous s’exécuterait un RC base de chaîne :

Vous pouvez mélanger et assortir et/ou, parmi beaucoup d’autres choses impressionnantes.

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