In Ihrer ersten Zeile geben Sie erfolgreich eine ActiveRecordRelation
zurück Objekt in @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])
An dieser Stelle könnten Sie zusätzlich .where(...)
anwenden Methoden, Bedingungen oder Bereiche auf @alarmsT
um den ARel-Ausdruck und die zurückgegebenen Ergebnisse weiter aufzubauen.
Sie führen dann jedoch einen Filter über diese Relation aus und konvertieren @alarmsT
zu einer Instanz von 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
Sie können den ARel-Ausdruck nicht mehr aufbauen, da Array
weiß nichts über .where(...)
Ihres ARels Methode oder einen Ihrer Alarm
die Bereiche oder Attribute des Modells. Aus diesem Grund erhalten Sie im folgenden Code die undefined method 'where' for #<Array:...
Fehler – Sie rufen .where()
auf auf einer Instanz von Array
; eine Methode, die es nicht gibt.
@alarmsF = []
@header.events.each do |e|
@alarmsF = @alarmsF + @alarmsT.where("alarms.location LIKE ?", e.town)
end
Sie können dies beheben, indem Sie nicht auswählen, um nach Kategorie-IDs zu filtern, und stattdessen einen Join verwenden. Das Erstellen eines solchen Joins (um das Vorhandensein mindestens einer Teilmenge von Werten in einer verwandten Tabelle/Spalte zu überprüfen) ist ziemlich ausführlich an Orten dokumentiert, die leicht über Google und hier auf StackOverflow zu finden sind.