In uw eerste regel retourneert u met succes een ActiveRecordRelation
object 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])
Op dit punt zou je extra .where(...)
. kunnen toepassen methoden, voorwaarden of scopes op @alarmsT
om de ARel-expressie en de geretourneerde resultaten verder op te bouwen.
U voert dan echter een filter uit over deze relatie, waarbij @alarmsT
. wordt geconverteerd naar een instantie van 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
U kunt de ARel-expressie niet meer opbouwen, aangezien Array
weet niets van uw ARel's .where(...)
methode, of een van uw Alarm
scopes of attributen van het model. Daarom krijg je in de onderstaande code de undefined method 'where' for #<Array:...
fout -- je belt .where()
op een instantie van Array
; een methode die niet bestaat.
@alarmsF = []
@header.events.each do |e|
@alarmsF = @alarmsF + @alarmsT.where("alarms.location LIKE ?", e.town)
end
U kunt dit oplossen door niet te selecteren om te filteren op categorie-ID's en in plaats daarvan een join te gebruiken. Het bouwen van zo'n join (om het bestaan van ten minste een subset van waarden in een gerelateerde tabel/kolom te verifiëren) is nogal wat gedocumenteerd op plaatsen die gemakkelijk te vinden zijn via Google en hier op StackOverflow.