2011-11-16 12 views
6

So che posso fare una domanda per i libri recenti sulla base di un array come inCome posso utilizzare un ambito con nome nel mio modello rispetto a una serie di elementi?

scope :recent_books, lambda {|since_dt| {:conditions=>{:created_at >= since_dt}}}

ma come posso fare una domanda simile quando ho un array di oggetti, ad esempio cosa succede se voglio sapere se ci sono dei record che corrispondono alle date in un array di [data1, data2, data3, ecc.]

Penso che ci debba essere un metodo di raccolta/iniezione/selezione/mappa che sarà fallo ma non sono sicuro che dalla loro lettura.

risposta

16

Se si passa un array come valore, ActiveRecord è abbastanza intelligente per confrontare per l'inclusione nella matrice. Ad esempio,

Book.where(:author_id => [1, 7, 42]) 

produce una query SQL con una clausola WHERE simile a:

WHERE "author_id" IN (1, 7, 42) 

È possibile usufruire di questo in un scope allo stesso modo si dovrebbe impostare condizioni normali:

class Book < .... 
    # Rails 3 
    scope :by_author, lambda { |author_id| where(:author_id => author_id) } 

    # Rails 2 
    named_scope :by_author, lambda { |author_id 
    { :conditions => {:author_id => author_id} } 
    } 
end 

Quindi è possibile passare un ID singolo o un array di ID a by_author e funzionerà solo:

Book.by_author([1,7,42]) 
+0

fantastico thx . Accetterà in 6 minuti (restrizione SO). –

+0

Anche se so che la sintassi è cambiata un po 'da 'named_scope' di rails2, l'approccio lambda funzionerà bene su rails2? Thx, Michael. –

+0

Sì. Per prima cosa ho usato questa sintassi con Rails 2, compresi alcuni ambiti nominati che combaciavano con gli array. Dovrai semplicemente cambiare la chiamata 'where' a un hash' conditions'. – David

4

In rotaie 4, posso controllare per l'inserimento di una stringa in un attributo matrice utilizzando un ambito come questo:

scope :news, -> { where(:categories => '{news}') } 

O con un argomento:

scope :by_category, ->(category) { where(:categories => "{#{category}}") } 
+0

grazie, questo mi ha aiutato molto. il {} intorno a {news} fa la differenza. Non ero familiare con quella sintassi .. – Ren

Problemi correlati