PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rails 3.2 - undefinierte Methode `where' für #

In Ihrer ersten Zeile geben Sie erfolgreich eine ActiveRecordRelation zurück Objekt 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])

An dieser Stelle könnten Sie zusätzlich .where(...) anwenden Methoden, Bedingungen oder Bereiche auf @alarmsT um den ARel-Ausdruck und die zurückgegebenen Ergebnisse weiter aufzubauen.

Sie führen dann jedoch einen Filter über diese Relation aus und konvertieren @alarmsT zu einer Instanz von 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

Sie können den ARel-Ausdruck nicht mehr aufbauen, da Array weiß nichts über .where(...) Ihres ARels Methode oder einen Ihrer Alarm die Bereiche oder Attribute des Modells. Aus diesem Grund erhalten Sie im folgenden Code die undefined method 'where' for #<Array:... Fehler – Sie rufen .where() auf auf einer Instanz von Array; eine Methode, die es nicht gibt.

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

Sie können dies beheben, indem Sie nicht auswählen, um nach Kategorie-IDs zu filtern, und stattdessen einen Join verwenden. Das Erstellen eines solchen Joins (um das Vorhandensein mindestens einer Teilmenge von Werten in einer verwandten Tabelle/Spalte zu überprüfen) ist ziemlich ausführlich an Orten dokumentiert, die leicht über Google und hier auf StackOverflow zu finden sind.