Jestem przyzwyczajony do Django, gdzie można uruchomić wiele metod filtrowania w zestawach zapytań, tj. Item.all.filter(foo="bar").filter(something="else")
.Filtrowanie zapytań ActiveRecord w szynach
To jednak nie jest takie łatwe w Railsach. Item.find(:all, :conditions => ["foo = :foo", { :foo = bar }])
Zwraca tablicę czyli to nie będzie działać:
Item.find(:all, :conditions => ["foo = :foo", { :foo = 'bar' }]).find(:all, :conditions => ["something = :something", { :something = 'else' }])
więc pomyślałem, że najlepszym sposobem na filtry „komin” to zmodyfikować tablicę warunków, a następnie uruchomić kwerendę.
Więc wymyśliłem tej funkcji:
def combine(array1,array2)
conditions = []
conditions[0] = (array1[0]+" AND "+array2[0]).to_s
conditions[1] = {}
conditions[1].merge!(array1[1])
conditions[1].merge!(array2[1])
return conditions
end
Zastosowanie:
array1 = [ "foo =: foo", {: 'bar' foo =}] tablica2 = [ "coś =: coś”, {: coś = 'else'}] warunki = Połącz (array1, tablica2) szt = Item.find (: all,: conditions => warunki)
ten pracował całkiem dobrze. Jednak chcę być w stanie połączyć dowolną liczbę tablic lub po prostu skrótem zapisu:
conditions = combine(combine(array1,array2),array3)
Czy ktoś może pomóc? Z góry dziękuję.
Tak, dokładnie to, czego chcę. Oglądałem screencast i było to dla mnie całkowicie zrozumiałe. Ale gdy tylko uruchomiłem kod, otrzymałem komunikat, że nazwany zakres jest niezdefiniowaną metodą. Potem zauważyłem, że pracowałem z Rails 1.8, więc klejnot zaktualizowałem tory do 2.3.something i nadal mam ten sam błąd .... ugh, wiedziałem, że nazwane zakresy były zbyt dobre, aby mogły być prawdziwe:/ – user94154
Jeśli zamroziłeś Railsy, wtedy twój kod nadal używa poprzedniej wersji Rails. Railsy 1.8 nigdy nie istniały, więc musisz mieć na myśli Ruby 1.8. rails -v to polecenie, które powie ci, jaka wersja Railsów istnieje w linii poleceń. skrypt/about powie Ci więcej o środowisku twojej aplikacji. –
również skrypt ruby / o nie został rozpoznany. Co oznacza zamrożone pod względem Railsów? – user94154