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.