ruby-on-rails ruby - ActiveRecord O consulta





ejemplos que (12)


Usa ARel

t = Post.arel_table

results = Post.where(
  t[:author].eq("Someone").
  or(t[:title].matches("%something%"))
)

El SQL resultante:

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%'))

¿Cómo se hace una consulta O en Rails 3 ActiveRecord. Todos los ejemplos que encuentro solo tienen consultas AND.

Editar: El método O está disponible desde Rails 5. Ver ActiveRecord::QueryMethods




Si desea utilizar matrices como argumentos, el siguiente código funciona en 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))

Más información: consultas OR con matrices como argumentos en Rails 4 .




Rails 5 viene con un or método. (l ActiveRecord::QueryMethods )

Este método acepta un objeto ActiveRecord::Relation . p.ej:

User.where(first_name: 'James').or(User.where(last_name: 'Scott'))



Book.where.any_of(Book.where(:author => 'Poe'), Book.where(:author => 'Hemingway')






Una versión actualizada de Rails / ActiveRecord puede admitir esta sintaxis de forma nativa. Se vería similar a:

Foo.where(foo: 'bar').or.where(bar: 'bar')

Como se señala en esta solicitud de extracción https://github.com/rails/rails/pull/9052

Por ahora, simplemente seguir con lo siguiente funciona muy bien:

Foo.where('foo= ? OR bar= ?', 'bar', 'bar')

Actualización: según https://github.com/rails/rails/pull/16052 la función or estará disponible en Rails 5

Actualización: la característica se ha fusionado con la rama Rails 5




Podrías hacerlo como:

Person.where("name = ? OR age = ?", 'Pearl', 24)

o más elegante, instala rails_or gem y hazlo como:

Person.where(:name => 'Pearl').or(:age => 24)



en Rails 3, debería ser

Model.where("column = ? or other_column = ?", value, other_value)

Esto también incluye sql sin procesar, pero no creo que haya una forma en ActiveRecord de hacer operaciones OR. Tu pregunta no es una pregunta novato.




El complemento de MetaWhere es completamente sorprendente.

Mezcla fácilmente OR's y AND's, une condiciones en cualquier asociación e incluso especifica OUTER JOIN's.

Post.where({sharing_level: Post::Sharing[:everyone]} | ({sharing_level: Post::Sharing[:friends]} & {user: {followers: current_user} }).joins(:user.outer => :followers.outer}



Con rails + arel, una forma más clara:

# 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



Si desea utilizar un operador OR en el valor de una columna, puede pasar una matriz a .where y ActiveRecord usará IN(value,other_value) :

Model.where(:column => ["value", "other_value"]

productos:

SELECT `table_name`.* FROM `table_name` WHERE `table_name`.`column` IN ('value', 'other_value')

Esto debería lograr el equivalente de un OR en una sola columna




El token de autenticidad está diseñado para que sepa que su formulario se envía desde su sitio web. Se genera desde la máquina en la que se ejecuta con un identificador único que solo su máquina puede conocer, lo que ayuda a prevenir ataques de falsificación de solicitudes entre sitios.

Si simplemente tiene dificultades con los rieles que le niegan el acceso a su script AJAX, puede usar

<%= form_authenticity_token %>

para generar el token correcto cuando está creando su formulario.

Puedes leer más sobre esto en la documentation .





ruby-on-rails activerecord ruby-on-rails-3