2011-11-16 30 views
6

wiem, że mogę zrobić kwerendę dla ostatnich książek opartych na tablicy jak wJak mogę użyć zakresu nazwanego w moim modelu w stosunku do tablicy elementów?

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

ale jak mogę zrobić podobną zapytanie kiedy mam tablicę elementów, na przykład co jeśli chcę się dowiedzieć, czy są jakieś rekordy pasujące do dat w tablicy [date1, date2, date3, itd.]

Myślę, że musi istnieć metoda collect/inject/select/map y zrób to, ale nie jestem pewien, co z ich czytania.

Odpowiedz

16

Jeśli przekazujesz tablicę jako wartość, funkcja ActiveRecord jest wystarczająco inteligentna, aby można ją było porównać w celu włączenia do tablicy. Na przykład,

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

tworzy zapytanie SQL z WHERE klauzuli podobnego do:

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

Można skorzystać z tego w scope ten sam sposób należy ustawić normalne warunki:

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 

Następnie można przekazać pojedynczy identyfikator lub tablicę identyfikatorów do by_author i będzie działać:

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

fantastyczny thx . Przyjmie w ciągu 6 minut (ograniczenie SO). –

+0

Chociaż wiem, że składnia zmieniła się nieco z 'named_scope' rails2, czy podejście lambda działałoby poprawnie w Rails2? Thx, Michael. –

+0

Tak. Po raz pierwszy użyłem tej składni w Rails 2, w tym w niektórych nazwanych zakresach, które pasowały do ​​tablic. Będziesz po prostu musiał zmienić wywołanie 'where' na mieszanie' conditions'. – David

4

W Rails 4, mogę sprawdzić włączenia ciąg w atrybucie tablicy przy użyciu zakresu tak:

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

Albo z argumentem:

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

dziękuję, to mi bardzo pomogło. {} wokół {news} robi różnicę. Nie znał tej składni .. – Ren