Във вашия първи ред вие успешно връщате ActiveRecordRelation
обект в @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])
На този етап можете да приложите допълнителен .where(...)
методи, условия или обхвати на @alarmsT
за по-нататъшно изграждане на ARel израза и върнатите резултати.
След това обаче стартирате филтър върху тази релация, преобразувайки @alarmsT
към екземпляр на 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
Вече не можете да изграждате ARel израза, тъй като Array
не знае за вашия ARel .where(...)
метод или някоя от вашите Alarm
обхвати или атрибути на модела. Ето защо в кода по-долу получавате undefined method 'where' for #<Array:...
грешка -- вие извиквате .where()
върху екземпляр на Array
; метод, който не съществува.
@alarmsF = []
@header.events.each do |e|
@alarmsF = @alarmsF + @alarmsT.where("alarms.location LIKE ?", e.town)
end
Можете да коригирате това, като не правите избора за филтриране по идентификатори на категории и вместо това използвате присъединяване. Изграждането на такова съединение (за проверка на съществуването на поне подмножество от стойности в свързана таблица/колона) е документирано доста на места, които лесно се намират чрез google и тук в StackOverflow.