W pierwszym wierszu pomyślnie zwracasz ActiveRecordRelation
obiekt w @alarmsT
# Extracts those alarms that are ACTIVE and have something in common with the tittles
@alarmsT = Alarm.activated.where("keyword in (?)", [@header.title_es, @header.title_en, @header.title_en])
W tym momencie możesz zastosować dodatkowe .where(...)
metody, warunki lub zakresy na @alarmsT
do dalszego budowania wyrażenia ARel i zwracanych wyników.
Jednak następnie uruchamiasz filtr nad tą relacją, konwertując @alarmsT
do instancji Array
# Extracts alarms when Header has at least the same categories as an alarm
@alarmsT = @alarmsT.select do |alarm|
@header.category_ids.all?{|c| alarm.category_ids.include? c }
end
Nie możesz już budować wyrażenia ARel, ponieważ Array
nie wie o .where(...)
Twojego ARel'a lub dowolny z Twoich Alarm
zakresy lub atrybuty modelu. Dlatego w poniższym kodzie otrzymujesz undefined method 'where' for #<Array:...
błąd - wywołujesz .where()
na instancji Array
; metoda, która nie istnieje.
@alarmsF = []
@header.events.each do |e|
@alarmsF = @alarmsF + @alarmsT.where("alarms.location LIKE ?", e.town)
end
Możesz to naprawić, nie wykonując filtrowania wyboru według identyfikatorów kategorii i zamiast tego używając sprzężenia. Budowanie takiego sprzężenia (aby zweryfikować istnienie przynajmniej podzbioru wartości w powiązanej tabeli/kolumnie) jest dość udokumentowane w miejscach, które można łatwo znaleźć przez google i tutaj na StackOverflow.