2011-06-13 11 views
28

Dove ho usato per fare questo:Il modo migliore per trovare un singolo record con ActiveRecord 3/Arel?

Foo.find_by_bar('a-value') 

ora posso fare questo:

Foo.where(:bar => 'a-value').limit(1).first 

È questo raccomandato? È questo il modo migliore? Dovrei continuare ad usare il "vecchio" modo perché continua ad essere utile zucchero sintattico, o c'è ancora un modo migliore di farlo ora, che supporterà il concatenamento e tutte le altre cose buone?

+2

In realtà mi piace molto il vecchio find_by_ *. L'intento è chiaro e, se è tutto ciò di cui hai bisogno, la sintassi è più semplice. –

+1

Ed è ancora perfettamente valido in Rails 3. Se si utilizza Rails 4, è possibile usare 'find_by (bar: 'a-value')'. – sevenseacat

risposta

38

Rails 4:

Foo.find_by bar: 'a_value' , wibble: 'a wibble value' 
+0

Puoi aggiungere una fonte per questo? – l8nite

+0

http://guides.rubyonrails.org/active_record_querying.html –

+0

Qualche idea sul perché RubyMine avverte che questo metodo non dovrebbe essere chiamato da view helper? – TyrionLannister

22

Penso che il modo preferibile per restituire un singolo record sarebbe lungo le linee del vostro secondo esempio, ma è possibile omettere la parte limite:

Foo.where(:bar => 'a-value').first 

Questo segue la nuova sintassi e supporta il concatenamento, se si desidera per aggiungere più condizioni alla ricerca.

+1

Usa 'Foo.where (: bar => 'a-value'). Prima!' Se vuoi assicurarti che venga trovato un record. In questo modo "ActiveRecord :: RecordNotFound' sarà sollevato altrimenti. – iltempo

3

Rails ti dà un intero carico di metodi magici per questo genere di cose:

Foo.find_by_bar('a-value') 

È inoltre possibile utilizzare più attributi:

Foo.find_by_bar_and_wibble('a foo value', 'a wibble value') 

e aggiungendo una! induce a gettare un RecordNotFound se nulla è trovato:

Foo.find_by_bar!('a-value') 
+8

Questi finder dinamici sono deprecati a partire da rails 4.0 (http://edgeguides.rubyonrails.org/4_0_release_notes.html#active-record-deprecations) quindi probabilmente non è una buona abitudine imparare ora. –

2

Altro alternativa:

Foo.find(:first, conditions: { bar: 'a-value' }) 

È inoltre possibile utilizzare più attributi:

Foo.find(:first, conditions: { bar: 'a-value' , wibble: 'a wibble value' }) 
Problemi correlati