2011-11-16 10 views
6

sé que puedo hacer una consulta de libros recientes sobre la base de una matriz como en¿Cómo puedo usar un alcance con nombre en mi modelo con una matriz de elementos?

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

pero ¿cómo puedo hacer una consulta similar cuando tienen una gran variedad de artículos, por ejemplo ¿Qué sucede si quiero saber si hay registros que coincidan con las fechas en una matriz de [fecha1, fecha2, fecha3, etc.]

Creo que debe haber un método de recopilación/inject/select/map que hazlo pero no estoy seguro de que a partir de su lectura.

Respuesta

16

Si pasa una matriz como el valor, ActiveRecord es lo suficientemente inteligente como para compararla para incluirla en la matriz. Por ejemplo,

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

produce una consulta SQL con una cláusula WHERE similar a:

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

Usted puede tomar ventaja de esto en un scope la misma forma que lo haría establecer condiciones normales:

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 

Luego puede pasar una única ID o una matriz de ID a by_author y simplemente funcionará:

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

fantástico THX . Se aceptará en 6 minutos (restricción SO). –

+0

Aunque sé que la sintaxis cambió un poco del 'named_scope' de rails2, ¿el enfoque lambda funcionaría bien en rails2? Thx, Michael. –

+0

Sí. Primero utilicé esta sintaxis con Rails 2, incluidos algunos ámbitos nombrados que coinciden con las matrices. Simplemente tendrá que cambiar la llamada 'where' a un hash' conditions'. – David

4

En los carriles 4, puedo comprobar por la inclusión de una cadena en un atributo matriz utilizando un ámbito de aplicación de esta manera:

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

O con un argumento:

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

gracias, esto me ayudó mucho. el {} alrededor de {news} marca la diferencia. No estaba familiarizado con esa sintaxis ... – Ren

Cuestiones relacionadas