ámbitos con lambda y argumentos en estilo Rails 4?

144

Me pregunto cómo se hace lo siguiente en Rails 4 o si solo uso el enfoque Rails 3 para usar una lambda que puede pasar un argumento de la misma manera con 4 que con 3.

Soy bastante nuevo en Rails 3 e intento trabajar con algunas muestras que ejecutan Rails 4.

Aquí está mi código de Rails 3:

class Person < ActiveRecord::Base
  scope :find_lazy, lambda {|id| where(:id => id)}
end

# In console I can call
Person.find_lazy(1)

Entonces, si esta es la forma de Rails 4 es usar -> {}, eso es una lambda, ¿verdad? scope :all_lazy, -> { select("*") }¿Qué pasa si necesito una discusión? Intenté algunas ideas diferentes y obtuve errores de argumento en la consola al usar -> {}.

kaplan
fuente

Respuestas:

305

Creo que debería ser:

scope :find_lazy, -> (id) { where(id: id) }
lis2
fuente
2
Documentación de respaldo , sección 14.1 específicamente.
Dennis
3
Yay, me ayudó a escribirscope :in_daterange, ->(start_date, end_date) { where(created_at: start_date.to_date.beginning_of_day..end_date.to_date.end_of_day) }
Epigene
44
Tenga en cuenta que si está utilizando Ruby 1.9, la sintaxis lambda corta no permite un espacio entre la flecha y un parámetro ( scope :find_lazy, ->(param)). En Ruby 2+, el espacio está permitido. Más información aquí ...
furman87
Syntex "moderno" en Rubyscope :find_lazy, -> id { where id: id }
swordray
11

Ruby tampoco ha desaprobado el viejo estilo de lambda, así que si te sientes más cómodo usando eso, hazlo.

Personalmente, no me gusta la sintaxis de lambda stabby, pero eventualmente se convertirán en la norma, por lo que no está de más acostumbrarse a ellos.

Branden Silva
fuente
66
Me gusta la sintaxis, pero parece incorrecto colocar los argumentos entre la flecha y el cuerpo de la función, mientras que debería haber sido "(id) -> {where ...}", lo que sería mucho más atractivo (y tampoco romper con mi conocimiento matemático ni la sintaxis del coffeescript). Al final "->" dice algo así como asignar valores a un resultado.
hurikhan77
Me encontré con una situación en la que usar el estilo anterior en Rails 4.2 devolvía valores booleanos incorrectos de la base de datos. Puede que no esté en desuso oficialmente, pero el uso de la sintaxis actualizada solucionó el problema.
stevenspiel
1
@ hurikhan77 Sí, es desconcertante que la sintaxis entre en conflicto con CoffeeScript coffeescript.org/#functions
Chloe
8

Rieles 4, puedes hacer:

scope :find_lazy, -> (id) { where(id: id) }

Eso estaba en el viejo rubí:

:id => id

Mejor hash:

id: id
sesperanto
fuente
5

chico, usualmente estaba usando la siguiente sintaxis de programación

scope :find_lazy, -> (id) { where(id: id) }

Pero cuando estaba revisando mi código usando Codacy, lo encontré alertándome sobre esta sintaxis

Use the `lambda` method for multiline lambdas.

Lo cambié para que funcione y funciona bien

  scope :find_lazy, lambda {|id|
    where(id: id)
  }
Astm
fuente
2

Para apoyar asociaciones:

scope :find_lazy, -> (object) { where(object_id: object.id) }
tokhi
fuente
1
scope :find_lazy, -> (id) { where(id: id) }

es equivalente a

self.find_lazy(id)
  where(id: id)
end

Basado en la guía de ruby ​​on rails :Using a class method is the preferred way to accept arguments for scopes.

No hay razón para usar ámbitos junto con lambdas en lugar de métodos de clase. Es una cuestión de preferencia personal. Pero, si desea seguir las pautas, debe usar el método de clase cuando hay argumentos involucrados.

mmsilviu
fuente