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, ...
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
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
Suchen Sie nach einer Art "PL/Ruby" mit ActiveRecord Unterstützung? –