Na prvním řádku úspěšně vracíte ActiveRecordRelation
objekt v @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])
V tomto okamžiku můžete použít další .where(...)
metody, podmínky nebo rozsahy na @alarmsT
k dalšímu sestavení výrazu Arel a vrácených výsledků.
Poté však spustíte filtr přes tento vztah a převedete @alarmsT
do instance 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
Od Array
již nemůžete vytvářet výraz ARel neví o vašem Arel .where(...)
nebo jakýkoli váš Alarm
rozsahy nebo atributy modelu. To je důvod, proč v níže uvedeném kódu získáváte undefined method 'where' for #<Array:...
chyba -- voláte .where()
na instanci Array
; metoda, která neexistuje.
@alarmsF = []
@header.events.each do |e|
@alarmsF = @alarmsF + @alarmsT.where("alarms.location LIKE ?", e.town)
end
Můžete to opravit tím, že neprovedete výběr filtrování podle ID kategorií a místo toho použijete spojení. Vytvoření takového spojení (pro ověření existence alespoň podmnožiny hodnot v související tabulce/sloupci) je poměrně dost zdokumentováno na místech, která lze snadno najít přes google a zde na StackOverflow.