Come si esegue una query OR in Rails 3 ActiveRecord. Tutti gli esempi che trovo hanno solo domande AND.
Modifica: il metodo OR è disponibile da Rails 5. Vedi ActiveRecord :: QueryMethods
Post.where(column: 'something').or(Post.where(other: 'else'))
Come si esegue una query OR in Rails 3 ActiveRecord. Tutti gli esempi che trovo hanno solo domande AND.
Modifica: il metodo OR è disponibile da Rails 5. Vedi ActiveRecord :: QueryMethods
Post.where(column: 'something').or(Post.where(other: 'else'))
Risposte:
Usa ARel
t = Post.arel_table
results = Post.where(
t[:author].eq("Someone").
or(t[:title].matches("%something%"))
)
L'SQL risultante:
ree-1.8.7-2010.02 > puts Post.where(t[:author].eq("Someone").or(t[:title].matches("%something%"))).to_sql
SELECT "posts".* FROM "posts" WHERE (("posts"."author" = 'Someone' OR "posts"."title" LIKE '%something%'))
matchesprodurrà LIKEper sqlite (senza distinzione tra maiuscole e minuscole per impostazione predefinita) e ILIKEsu postgres (necessita di distinzione tra maiuscole e minuscole esplicite come l'operatore).
Se si desidera utilizzare un operatore OR sul valore di una colonna, è possibile passare un array a .wheree ActiveRecord utilizzerà IN(value,other_value):
Model.where(:column => ["value", "other_value"]
uscite:
SELECT `table_name`.* FROM `table_name` WHERE `table_name`.`column` IN ('value', 'other_value')
Questo dovrebbe raggiungere l'equivalente di un ORsu una singola colonna
in Rails 3, dovrebbe essere
Model.where("column = ? or other_column = ?", value, other_value)
Ciò include anche sql non elaborato, ma non credo che in ActiveRecord sia possibile eseguire operazioni OR. La tua domanda non è una domanda noob.
Page.where("pages.column = ? or pages.other_column = ?", value, other_value)
Una versione aggiornata di Rails / ActiveRecord può supportare questa sintassi in modo nativo. Sembrerebbe simile a:
Foo.where(foo: 'bar').or.where(bar: 'bar')
Come indicato in questa richiesta pull https://github.com/rails/rails/pull/9052
Per ora, semplicemente attenersi a quanto segue funziona alla grande:
Foo.where('foo= ? OR bar= ?', 'bar', 'bar')
Aggiornamento: secondo https://github.com/rails/rails/pull/16052 la orfunzione sarà disponibile in Rails 5
Aggiornamento: la funzione è stata unita al ramo di Rails 5
orè ora disponibile Rails 5 ma non implementato in questo modo perché prevede che venga passato 1 argomento. Si aspetta un oggetto Arel. Vedi la risposta accettata
ormetodo in ActiveRecord funziona se lo stai utilizzando direttamente: ma può infrangere le tue aspettative se viene utilizzato in un ambito che viene quindi incatenato.
Rails ha recentemente aggiunto questo in ActiveRecord. Sembra essere rilasciato in Rails 5. Già impegnato a master:
https://github.com/rails/rails/commit/9e42cf019f2417473e7dcbfcb885709fa2709f89
Post.where(column: 'something').or(Post.where(other: 'else'))
# => SELECT * FROM posts WHERE (column = 'something') OR (other = 'else)
Rails 5 viene fornito con un ormetodo. (l inchiostro alla documentazione )
Questo metodo accetta un ActiveRecord::Relationoggetto. per esempio:
User.where(first_name: 'James').or(User.where(last_name: 'Scott'))
Se si desidera utilizzare le matrici come argomenti, il seguente codice funziona in Rails 4:
query = Order.where(uuid: uuids, id: ids)
Order.where(query.where_values.map(&:to_sql).join(" OR "))
#=> Order Load (0.7ms) SELECT "orders".* FROM "orders" WHERE ("orders"."uuid" IN ('5459eed8350e1b472bfee48375034103', '21313213jkads', '43ujrefdk2384us') OR "orders"."id" IN (2, 3, 4))
Ulteriori informazioni: OPPURE query con matrici come argomenti in Rails 4 .
Order.where(query.where_values.inject(:or))usare arel fino in fondo.
Il plugin MetaWhere è assolutamente sorprendente.
Mescola facilmente OR e AND, unisciti alle condizioni di qualsiasi associazione e specifica anche OUTER JOIN!
Post.where({sharing_level: Post::Sharing[:everyone]} | ({sharing_level: Post::Sharing[:friends]} & {user: {followers: current_user} }).joins(:user.outer => :followers.outer}
Aggiungi un OR nelle condizioni
Model.find(:all, :conditions => ["column = ? OR other_column = ?",value, other_value])
Ho appena estratto questo plugin dal lavoro client che ti consente di combinare gli ambiti con .or., ad es. Post.published.or.authored_by(current_user). Anche Squeel (la più recente implementazione di MetaSearch) è eccezionale, ma non ti consente gli ambiti OR, quindi la logica della query può diventare un po 'ridondante.
Con rails + arel, un modo più chiaro:
# Table name: messages
#
# sender_id: integer
# recipient_id: integer
# content: text
class Message < ActiveRecord::Base
scope :by_participant, ->(user_id) do
left = arel_table[:sender_id].eq(user_id)
right = arel_table[:recipient_id].eq(user_id)
where(Arel::Nodes::Or.new(left, right))
end
end
produce:
$ Message.by_participant(User.first.id).to_sql
=> SELECT `messages`.*
FROM `messages`
WHERE `messages`.`sender_id` = 1
OR `messages`.`recipient_id` = 1
Potresti farlo come:
Person.where("name = ? OR age = ?", 'Pearl', 24)
o più elegante, installa rails_o gem e fallo come:
Person.where(:name => 'Pearl').or(:age => 24)
Vorrei aggiungere questa è una soluzione per cercare più attributi di un ActiveRecord. Da
.where(A: param[:A], B: param[:B])
cercherà A e B.
Book.where.any_of(Book.where(:author => 'Poe'), Book.where(:author => 'Hemingway')