¿ámbitos con lambda y argumentos en estilo Rails 4?


Me pregunto cómo se hace lo siguiente en Rails 4 o si simplemente 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 a través de algunas muestras ejecutando Rails 4.

Aquí está mi código Rails 3:

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

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

Así que si esta es la forma de Rails 4 es usar el -> {}, eso es una lambda, ¿verdad? scope :all_lazy, -> { select("*") } Y si necesitara una discusión. Probé algunas ideas diferentes y obtuve errores de argumento en la consola cuando se utiliza el - > {}.

Author: user2262149, 2013-05-16

5 answers

Creo que debería ser

 scope :find_lazy, -> (id) { where(id: id) }
 281
Author: lis2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-22 23:46:19

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

Personalmente no me gusta la sintaxis de lambda, pero con el tiempo probablemente se convertirán en la norma, por lo que no hace daño acostumbrarse a ellos.

 10
Author: Branden Silva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-02 14:53:21

Rails 4, puedes hacer:

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

Que estaba en el antiguo rubí:

:id => id

Mejor hash:

id: id
 6
Author: sesperanto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-27 13:03:44

Para apoyar a las asociaciones:

scope :find_lazy, -> (object) { where(object_id: object.id) }
 1
Author: tokhi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-03 13:40:02

Guy Yo solía usar la siguiente sintaxis de programación

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

Pero cuando estaba revisando mi código usando Codacy encontré que me alertaba sobre esta sintaxis

Use the `lambda` method for multiline lambdas.

Lo cambié para ser y funciona bien

  scope :find_lazy, lambda {|id|
    where(id: id)
  }
 0
Author: Astm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-04 10:08:14