I din første linje returnerer du en ActiveRecordRelation
objekt i @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])
På dette tidspunkt kan du anvende yderligere .where(...)
metoder, betingelser eller omfang på @alarmsT
for yderligere at opbygge ARel-udtrykket og resultaterne returneres.
Men du kører derefter et filter over denne relation og konverterer @alarmsT
til en forekomst af 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
Du kan ikke længere opbygge ARel-udtrykket, da Array
kender ikke til din ARel's .where(...)
metode eller en af dine Alarm
modellens omfang eller egenskaber. Dette er grunden til, at du i koden nedenfor får den undefined method 'where' for #<Array:...
fejl -- du kalder .where()
på en forekomst af Array
; en metode, der ikke eksisterer.
@alarmsF = []
@header.events.each do |e|
@alarmsF = @alarmsF + @alarmsT.where("alarms.location LIKE ?", e.town)
end
Du kan løse dette ved ikke at vælge at filtrere efter kategori-id'er og i stedet bruge en joinforbindelse. Opbygning af en sådan joinforbindelse (for at bekræfte eksistensen af mindst en delmængde af værdier i en relateret tabel/kolonne) er dokumenteret en del på steder, der nemt kan findes via google og her på StackOverflow.