2015-08-11 5 views
10

Wir starten ein Projekt auf Basis von Ruby on Rails. Früher haben wir mit Perl- und PostgreSQL-Funktionen gearbeitet, und mit Rails und Active Record habe ich nicht gesehen, wie wir Funktionen in PostgreSQL erstellen und den Datensatz mit Active Record und Modellen behalten sollen.Kann ich PostgreSQL-Funktionen auf Ruby on Rails schreiben?

Ich weiß, wir können es manuell in PostgreSQL erstellen, aber die "Magie" mit Active Record ist, dass die Datenbank mit allen Modellen neu erstellt werden kann.

Gibt es eine Möglichkeit, die PostgreSQL-Funktion mit Rails zu erstellen und in den Modellen zu behalten?

+0

AFAIK gibt es keine integrierte Möglichkeit zu schreiben SQL-Funktionen über Rails, aber abhängig von den Funktionen, könnten sie besser als [Bereiche] (http://guides.rubyonrails.org/active_record_querying.html#scopes) oder andere Modellmethoden refaktoriert werden. – eirikir

+0

Sie könnten jedoch einfach eine Klasse in das lib-Verzeichnis schreiben, das SQL-Funktionen definiert. Sie können beliebiges SQL über 'ActiveRecord :: Base.connection.execute' ausführen. – eirikir

+0

Suchen Sie nach einer Art "PL/Ruby" mit ActiveRecord Unterstützung? –

Antwort

24

Dieser Teil Ihrer Frage:

Ich weiß, dass wir es manuell in PostgreSQL erstellen können, aber die „Magie“ mit Active Record ist, dass die Datenbank mit allen Modellen neu erstellt werden kann.

sagt mir, dass Sie wirklich für einen Weg suchen, PostgreSQL Funktionen mit den normalen Rails Migration und Rake Aufgaben wie db:schema:load zu integrieren.

Hinzufügen und Funktionen in Migrationen zu entfernen ist einfach:

def up 
    connection.execute(%q{ 
    create or replace function ... 
    }) 
end 

def down 
    connection.execute(%q{ 
    drop function ... 
    }) 
end 

Sie benötigen anstelle eines einzelnen change Verfahren getrennt up und down Methoden zu verwenden, da Active keine Ahnung haben, wie geschweige denn anwenden umkehren eine Funktion Schöpfung . Und Sie verwenden connection.execute, um die Raw-Funktionsdefinition an PostgreSQL zu übergeben.

jedoch schema.rb und die üblichen Rake Aufgaben, die mit schema.rb (wie db:schema:load und db:schema:dump) arbeiten nicht wissen, was mit PostgreSQL-Funktionen zu tun, und anderen Dingen, die Activerecord nicht versteht. Es gibt einen Weg, um dieses obwohl, können Sie eine structure.sql Datei statt schema.rb indem verwenden wählen:

config.active_record.schema_format = :sql 

in Ihrer config/application.rb Datei. Danach schreibt db:migrate eine db/structure.sql Datei (die nur ein roher SQL-Dump Ihrer PostgreSQL-Datenbank ohne Ihre Daten ist) anstelle von db/schema.rb.

  • db:structure:dump statt db:schema:dump
  • db:structure:load statt db:schema:load

Alles andere sollte funktionieren auf die gleiche: Sie werden auch verschiedene Rake Aufgaben für die Arbeit mit structure.sql verwenden.

auch dieser Ansatz kann Sie andere Dinge in Ihrer Datenbank verwenden, die Activerecord nicht verstehen: CHECK-löst, nicht einfältig Spalten-Standardwert, ...

0

Wenn Sie sie nur irgendwo in Ihrer Rails-App erstellen müssen, ist dies über ActiveRecord::Base.connection.execute möglich, mit dem Sie Raw-SQL-Abfragen ausführen können. mit ActiveRecord::Base.connection.execute auch

stmt = 'CREATE FUNCTION...' 
ActiveRecord::Base.connection.execute stmt 

Sie würden die Funktion rufen Sie dann (ich könnte mir vorstellen, Sie Methoden in Ihrem Modell zu handhaben haben würde).