ambiti con lambda e argomenti in stile Rails 4?


144

Mi chiedo come sia fatto quanto segue in Rails 4 o se uso semplicemente l'approccio Rails 3 per usare un lambda che può passare un argomento allo stesso modo con 4 come faccio con 3.

Sono abbastanza nuovo su Rails 3 e sto cercando di analizzare alcuni esempi con Rails 4.

Ecco il mio codice Rails 3:

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

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

Quindi se questo è il modo di Rails 4 è usare il -> {}, è un lambda, giusto? scope :all_lazy, -> { select("*") }E se avessi bisogno di una discussione. Ho provato alcune idee diverse e ho riscontrato errori di argomento nella console usando -> {}.

Risposte:


305

Penso che dovrebbe essere:

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

2
Documentazione di supporto , sezione 14.1 in particolare.
Dennis,

3
Sì, mi ha aiutato a scriverescope :in_daterange, ->(start_date, end_date) { where(created_at: start_date.to_date.beginning_of_day..end_date.to_date.end_of_day) }
Epigene il

4
Si noti che se si utilizza Ruby 1.9, la breve sintassi lambda non consente uno spazio tra la freccia e un parametro ( scope :find_lazy, ->(param)). In Ruby 2+, lo spazio è consentito. Maggiori informazioni qui ...
furman87

scope :find_lazy, -> id { where id: id }
Sintassi

11

Anche Ruby non ha deprecato il vecchio stile di lambda, quindi se ti senti più a tuo agio a usarlo, fallo pure.

Personalmente non mi piace la sintassi del stabby lambda, ma alla fine diventeranno probabilmente la norma, quindi non fa male abituarsi a loro.


6
Mi piace la sintassi, ma sembra assolutamente sbagliato posizionare gli argomenti tra la freccia e il corpo della funzione, mentre avrebbe dovuto essere "(id) -> {where ...}" che sarebbe molto più attraente (e non sarebbe nemmeno rompere con le mie conoscenze matematiche né la sintassi di coffeescript). Alla fine "->" dice qualcosa come mappare i valori a un risultato.
hurikhan77,

Mi sono imbattuto in una situazione in cui l'utilizzo del vecchio stile in Rails 4.2 restituiva valori booleani errati dal database. Potrebbe non essere ufficialmente deprecato, ma l'utilizzo della sintassi aggiornata ha risolto il problema.
Stevenspiel,

1
@hurikhan77 Sì, è sconcertante che la sintassi sia in conflitto con CoffeeScript coffeescript.org/#functions
Chloe,

8

Rails 4, puoi fare:

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

Quello era nel vecchio rubino:

:id => id

Hash migliore:

id: id

5

ragazzo di solito stavo usando la sintassi di programmazione qui sotto

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

Ma quando stavo rivedendo il mio codice usando Codacy, lo trovai che mi avvisava di questa sintassi

Use the `lambda` method for multiline lambdas.

L'ho cambiato per essere e funziona bene

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

2

Per sostenere le associazioni:

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

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

è equivalente a

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

Basato su ruby on rails guide :Using a class method is the preferred way to accept arguments for scopes.

Non vi è alcun motivo per utilizzare gli ambiti insieme a lambdas rispetto ai metodi di classe. È una questione di preferenze personali. Ma, se vuoi seguire le linee guida, dovresti usare il metodo class quando sono coinvolti argomenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.