En su primera línea, está devolviendo con éxito una ActiveRecordRelation
objeto en @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])
En este punto, podría aplicar .where(...)
adicional métodos, condiciones o alcances en @alarmsT
para construir aún más la expresión ARel y los resultados devueltos.
Sin embargo, luego ejecuta un filtro sobre esta relación, convirtiendo @alarmsT
a una instancia de 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
Ya no puede construir la expresión ARel, ya que Array
no conoce el .where(...)
de tu ARel método, o cualquiera de sus Alarm
los alcances o atributos del modelo. Esta es la razón por la que en el siguiente código obtienes el undefined method 'where' for #<Array:...
error:estás llamando a .where()
en una instancia de Array
; un método que no existe.
@alarmsF = []
@header.events.each do |e|
@alarmsF = @alarmsF + @alarmsT.where("alarms.location LIKE ?", e.town)
end
Puede solucionar esto al no hacer la selección para filtrar por ID de categoría y, en su lugar, usar una combinación. La creación de una combinación de este tipo (para verificar la existencia de al menos un subconjunto de valores en una tabla/columna relacionada) está bastante documentada en lugares que se encuentran fácilmente a través de Google y aquí en StackOverflow.