Estou usando o Rails3, ActiveRecord
Imaginando como posso encadear os escopos com instruções OR em vez de AND.
por exemplo
Person.where(:name => "John").where(:lastname => "Smith")
Isso normalmente retorna:
name = 'John' AND lastname = 'Smith'
mas eu gostaria:
`name = 'John' OR lastname = 'Smith'
Respostas:
Você faria
No momento, não há nenhum outro suporte OR pela nova sintaxe do AR3 (isto é, sem o uso de pedras preciosas de terceiros).
fonte
.or
incorporado .De acordo com essa solicitação , o Rails 5 agora suporta a seguinte sintaxe para encadear consultas:
Há também um backport da funcionalidade no Rails 4.2 por meio desta gema.
fonte
Use o ARel
fonte
Basta postar a sintaxe da matriz para a mesma coluna OU consultas para ajudar a espreitar.
fonte
Atualização para o Rails4
não requer gemas de terceiros
Resposta antiga
não requer gemas de terceiros
fonte
or
ou outros operadores dentro de um bloco de texto, nenhum dos quais é refletido no código do OP....where_values.join(' OR ')
no meu caso.tap {|sc| sc.bind_values = [a, b].map(&:bind_values) }
peça se seus escopos não tiverem nenhuma variável que precise de ligação.Você também pode usar a gema MetaWhere para não misturar seu código com o material SQL:
fonte
Caso alguém esteja procurando uma resposta atualizada para esta, parece que existe uma solicitação de recebimento existente para colocar isso no Rails: https://github.com/rails/rails/pull/9052 .
Graças ao patch de macacos de @ j-mcnally para ActiveRecord ( https://gist.github.com/j-mcnally/250eaaceef234dd8971b ), você pode fazer o seguinte:
Ainda mais valiosa é a capacidade de encadear escopos com
OR
:Em seguida, você pode encontrar todas as pessoas com nome ou sobrenome ou cujo pai com sobrenome
Não é o melhor exemplo para o uso disso, mas apenas tentando ajustá-lo à pergunta.
fonte
.or
funcionalidade da cadeia. Consegui usar o patch de macaco que mencionei no Rails> = 3.2; no entanto, você pode esperar o Rails 5 introduzir alterações de longa data em seu código.Para mim (Rails 4.2.5), funciona apenas assim:
fonte
Este seria um bom candidato para o MetaWhere se você estiver usando o Rails 3.0+, mas não funciona no Rails 3.1. Você pode experimentar o rodo . É feito pelo mesmo autor. Veja como você executaria uma cadeia baseada em OR:
Você pode misturar e combinar AND / OR, entre muitas outras coisas incríveis .
fonte
Uma versão atualizada do Rails / ActiveRecord pode suportar essa sintaxe nativamente. Seria semelhante a:
Conforme observado nesta solicitação de recebimento https://github.com/rails/rails/pull/9052
Por enquanto, basta seguir os seguintes procedimentos:
fonte
Foo.where(foo: 'bar1').or.where(bar: 'bar2')
não funciona. Deve estar em Foo.where (foo: 'bar1'). Or.where (Foo.where (bar: 'bar2')) #Trilhos 4 + Âmbito + Arel
Tentei encadear escopos nomeados com .ou sem sorte, mas isso funcionou para encontrar qualquer coisa com esses conjuntos de booleanos. Gera SQL como
fonte
Trilhos 4
fonte
Se você deseja fornecer um escopo (em vez de trabalhar explicitamente em todo o conjunto de dados), veja o que você deve fazer com o Rails 5:
Ou:
fonte
Se você não pode escrever a cláusula where manualmente para incluir a instrução "ou" (ou seja, deseja combinar dois escopos), pode usar union:
(fonte: União de consultas ActiveRecord )
Isso retornará todos os registros correspondentes a qualquer consulta. No entanto, isso retorna uma matriz, não um arel. Se você realmente deseja devolver um arel, verifique esta lista: https://gist.github.com/j-mcnally/250eaaceef234dd8971b .
Isso fará o trabalho, contanto que você não se importe com os trilhos de fixação de macacos.
fonte
Veja também estas questões relacionadas: aqui , aqui e aqui
Para trilhos 4, com base neste artigo e nesta resposta original
Observe a cautela do artigo no final:
fonte
Essa é uma maneira muito conveniente e funciona bem no Rails 5:
fonte
a
squeel
gema fornece uma maneira incrivelmente fácil de fazer isso (antes disso, usei algo como o método @ coloradoblue):fonte
Portanto, a resposta para a pergunta original, você pode associar escopos com 'ou' em vez de 'e' parece ser "não, não pode". Mas você pode codificar manualmente um escopo ou consulta completamente diferente que faça o trabalho ou usar uma estrutura diferente do ActiveRecord, por exemplo, MetaWhere ou Squeel. Não é útil no meu caso
Estou 'ou' criando um escopo gerado pelo pg_search, que faz um pouco mais do que o select, ele inclui order by ASC, o que torna uma bagunça uma união limpa. Eu quero 'ou' com um escopo artesanal que faz coisas que não posso fazer no pg_search. Então eu tive que fazer assim.
Ou seja, transforme os escopos em sql, coloque colchetes em torno de cada um, junte-os e depois encontre_by_sql usando o sql gerado. É um pouco ruim, mas funciona.
Não, não me diga que posso usar "against: [: name,: code]" em pg_search, gostaria de fazer assim, mas o campo 'name' é um hstore, que o pg_search não pode manipular ainda. Portanto, o escopo pelo nome deve ser criado à mão e depois associado ao escopo pg_search.
fonte
fonte