PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Rails 3.2 - méthode indéfinie `where' pour #

Dans votre première ligne, vous renvoyez avec succès un ActiveRecordRelation objet dans @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])

À ce stade, vous pouvez appliquer un .where(...) supplémentaire méthodes, conditions ou étendues sur @alarmsT pour construire davantage l'expression ARel et les résultats renvoyés.

Cependant, vous exécutez ensuite un filtre sur cette relation, convertissant @alarmsT à une instance 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

Vous ne pouvez plus construire l'expression ARel, car Array ne connaît pas le .where(...) de votre ARel méthode, ou l'un de vos Alarm portées ou attributs du modèle. C'est pourquoi dans le code ci-dessous vous obtenez la méthode undefined method 'where' for #<Array:... erreur -- vous appelez .where() sur une instance de Array; une méthode qui n'existe pas.

@alarmsF = [] 
@header.events.each do |e|
  @alarmsF =  @alarmsF + @alarmsT.where("alarms.location LIKE ?", e.town)
end

Vous pouvez résoudre ce problème en ne faisant pas la sélection pour filtrer par identifiants de catégorie et en utilisant à la place une jointure. La construction d'une telle jointure (pour vérifier l'existence d'au moins un sous-ensemble de valeurs dans une table/colonne connexe) est assez documentée sur des endroits facilement trouvables via Google et ici sur StackOverflow.