PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Rails 3.2 - método indefinido `where' para #

Em sua primeira linha, você está retornando com sucesso um ActiveRecordRelation objeto em @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])

Neste ponto, você pode aplicar .where(...) adicional métodos, condições ou escopos em @alarmsT para construir ainda mais a expressão ARel e os resultados retornados.

No entanto, você executa um filtro sobre essa relação, convertendo @alarmsT para uma instância 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

Você não pode mais construir a expressão ARel, pois Array não sabe sobre o .where(...) do seu ARel método, ou qualquer um dos seus Alarm escopos ou atributos do modelo. É por isso que no código abaixo você está recebendo o undefined method 'where' for #<Array:... erro -- você está chamando .where() em uma instância de Array; um método que não existe.
@alarmsF = [] 
@header.events.each do |e|
  @alarmsF =  @alarmsF + @alarmsT.where("alarms.location LIKE ?", e.town)
end

Você pode corrigir isso não selecionando para filtrar por IDs de categoria e, em vez disso, usando uma junção. A construção de tal junção (para verificar a existência de pelo menos um subconjunto de valores em uma tabela/coluna relacionada) é documentada bastante em locais facilmente encontrados no google e aqui no StackOverflow.