2017-05-21 1 views
1

Ich habe ein Ereignis, das zu Wiederholen gehört und ich versuche, den Wiederholungstitel anzuzeigen, wenn ein Ereignis angezeigt wird. Aber ich will nicht zwei Datenbankaufrufe, die dieseActiveRecord :: StatementInvalid in Controller bei Verwendung eines ActiveRecord mit einem Tabellennamen und einer Postgresql-Ansicht

@event.Repeat.title 

machen würde habe ich eine postgresql Ansicht mit einer Migration unter

class EventWithRepeat < ActiveRecord::Migration[5.1] 
    def up 
    self.connection.execute %Q(create view event_with_repeat as 
           Select events.*, repeats.title as RepeatTitle from Events 
           inner join repeats on events.repeat_id = repeats.id;) 
    end 

    def down 
    self.connection.execute %Q(drop view event_with_repeat;) 
    end 

end 

Das Problem ist auf jeden Fall mit der Migration oben. Ich kann diese Migration nicht einfach ausführen. Ausführen von Rake db: migrieren tut nichts. Rake db: migrate: down mit der Version führt zu einem Fehler, weil die Relation nicht existiert und nicht gelöscht werden kann.

Das Erstellen der SQL-Ansicht direkt in der Datenbank funktioniert, aber meine Migration scheint nicht ausgeführt werden. Ich bin mit Schienen 5.

Dies ist meine Klasse Active

class EventRepeat < ActiveRecord::Base 
    self.table_name = "event_with_repeat" 
    self.primary_key = "id" 

    def readonly? 
    true 
    end 
end 

Dies ist die Methode in meinem Controller-Klasse

def show 
    @event = EventRepeat.find(params[:id]) 
end 

ich die Migrationen lief und ich kann die Ansicht in psql so die Aussicht ist vorhanden. Ich habe db: reset gemacht, aber das hat nicht geholfen.

Die Fehlermeldung zeigt, dass das Problem mit dieser SQL ist

SELECT a.attname, format_type(a.atttypid, a.atttypmod), 
        pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod, 
        c.collname, col_description(a.attrelid, a.attnum) AS comment 
       FROM pg_attribute a 
       LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum 
       LEFT JOIN pg_type t ON a.atttypid = t.oid 
       LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation 
       WHERE a.attrelid = '"event_with_repeat"'::regclass 
       AND a.attnum > 0 AND NOT a.attisdropped 
       ORDER BY a.attnum 

und die Fehlermeldung ist

ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR: relation "event_with_repeat" does not exist 

aber die Aussicht event_with_repeat existiert.

Ich habe dies in meiner Ansicht

<%= @event.RepeatTitle %> 

Irgendwelche Ideen, wie man diese Fehler zu beheben und was falsch war mit dem Code?

Danke.

Antwort

0

Ich habe das Problem behoben, indem ich die Migration löschte und neu erstellte. Aber ich stoße wieder auf das gleiche Problem, wenn ich rake db: reset ausführe. Dieser Befehl erstellt die Tabellen, jedoch nicht die postgresql-Ansicht, und es sieht nicht so aus, als würde die letzte Migration ausgeführt. Ich muss die Migration löschen und neu erstellen, damit sie funktioniert.

Es sieht so aus, als ob diese Migration nur einmal ausgeführt wird?

Die Reihenfolge, in der die Migrationen

erstellt wurden
  1. 20170515163011_create_events
  2. 20170520203458_create_repeats
  3. 20170520203852_add_repeat_to_event
  4. 20170521190734_event_with_repeat

ich das Schema-Format zu ändern: SQL config.active_record. schema_format: sql in der Anwendung .rb

Dumping das Schema zu structure.sql funktioniert, aber Rake ausführen db: reset erneut erstellt nicht die Ansicht. Ich muss die Migration immer löschen und neu erstellen.

Verwandte Themen