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


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

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}

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

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


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.


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

Solo agregue un quirófano en las condiciones

Model.find(:all, :conditions => ["column = ? OR other_column = ?",value, other_value])

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)

Acabo de extraer este complemento del trabajo del cliente que le permite combinar ámbitos con .or. , ex. Post.published.or.authored_by(current_user) . Squeel (implementación más reciente de MetaSearch) también es excelente, pero no te permite O alcances, por lo que la lógica de consulta puede ser un poco redundante.


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 .


El token de autenticidad se usa para prevenir ataques de falsificación de solicitudes entre sitios (CSRF). Para comprender el token de autenticidad, primero debe comprender los ataques CSRF.

CSRF

Supongamos que usted es el autor de bank.com . Tiene un formulario en su sitio que se utiliza para transferir dinero a una cuenta diferente con una solicitud GET:

Un pirata informático podría simplemente enviar una solicitud HTTP al servidor que diga GET /transfer?amount=$1000000&account-to=999999 , ¿verdad?

Incorrecto. El ataque de los hackers no funcionará. El servidor básicamente pensará?

Eh ¿Quién es este chico tratando de iniciar una transferencia. No es el dueño de la cuenta, eso es seguro.

¿Cómo sabe esto el servidor? Porque no hay una cookie session_id autentique al solicitante.

Cuando inicia sesión con su nombre de usuario y contraseña, el servidor establece una cookie de session_id en su navegador. De esa manera, no tiene que autenticar cada solicitud con su nombre de usuario y contraseña. Cuando su navegador envía la cookie session_id , el servidor sabe:

Oh, ese es John Doe. Se ha registrado con éxito hace 2.5 minutos. Él es bueno para ir

Un hacker podría pensar:

Hmm Una solicitud HTTP normal no funcionará, pero si pudiera obtener esa cookie de session_id , estaría dorado.

El navegador de los usuarios tiene un conjunto de cookies para el dominio bank.com . Cada vez que el usuario realiza una solicitud al dominio bank.com , todas las cookies se envían. Incluyendo la cookie session_id .

Por lo tanto, si un pirata informático pudiera hacer que realices la solicitud GET que transfiere dinero a su cuenta, tendrá éxito. ¿Cómo podría engañarte para que lo hicieras? Con Cross Site Request Forgery.

Es bastante simple, en realidad. El hacker podría conseguir que visites su sitio web. En su sitio web, podría tener la siguiente etiqueta de imagen:

<img src="http://bank.com/transfer?amount=$1000000&account-to=999999">

Cuando el navegador de los usuarios encuentre esa etiqueta de imagen, hará una solicitud GET a esa URL. Y dado que la solicitud proviene de su navegador, le enviará todas las cookies asociadas con bank.com . Si el usuario ha bank.com recientemente en bank.com ... se bank.com la cookie session_id , y el servidor pensará que el usuario tenía la intención de transferir $ 1,000,000 a la cuenta 999999.

Bueno, no visites sitios peligrosos y estarás bien.

Eso no es suficiente. ¿Qué pasa si alguien publica esa imagen en Facebook y aparece en tu muro? ¿Qué sucede si se inyecta en un sitio que está visitando con un ataque XSS?

No es tan malo. Sólo las solicitudes GET son vulnerables.

No es verdad. Un formulario que envía una solicitud POST puede generarse dinámicamente. Aquí está el ejemplo de la Guía de Rails sobre Seguridad :

<a href="http://www.harmless.com/" onclick="
  var f = document.createElement('form');
  f.style.display = 'none';
  this.parentNode.appendChild(f);
  f.method = 'POST';
  f.action = 'http://www.example.com/account/destroy';
  f.submit();
  return false;">To the harmless survey</a>

Token de Autenticidad

Cuando su ApplicationController tiene esto:

protect_from_forgery with: :exception

Esta:

<%= form_tag do %>
  Form contents
<% end %>

Se compila en esto:

<form accept-charset="UTF-8" action="/" method="post">
  <input name="utf8" type="hidden" value="&#x2713;" />
  <input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />
  Form contents
</form>

En particular, se genera lo siguiente:

<input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />

Para protegerse contra los ataques CSRF, si Rails no ve el token de autenticidad enviado junto con una solicitud, no considerará la solicitud como segura.

¿Cómo se supone que un atacante sabe qué es este token? Se genera aleatoriamente un valor diferente cada vez que se genera el formulario:

Un ataque de Cross Site Scripting (XSS): así es como. Pero esa es una vulnerabilidad diferente para un día diferente.





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