Questa parte della tua domanda:
So che possiamo crearlo manualmente in PostgreSQL, ma la "magia" con Active Record è che il database può essere ricreato con tutti i modelli.
mi dice che siete veramente alla ricerca di un modo per integrare le funzioni di PostgreSQL con le normali attività di processo Rails migrazione e Rake quali db:schema:load
.
Aggiungere e rimuovere le funzioni nelle migrazioni è facile:
def up
connection.execute(%q{
create or replace function ...
})
end
def down
connection.execute(%q{
drop function ...
})
end
è necessario utilizzare separati up
e down
metodi, invece di un unico metodo change
perché ActiveRecord avrà alcuna idea di come applicare per non parlare di invertire una creazione funzione . E tu usi connection.execute
per alimentare la definizione della funzione grezza su PostgreSQL.
Tuttavia, schema.rb
ei soliti compiti Rake che lavorano con schema.rb
(come db:schema:load
e db:schema:dump
) non sapranno cosa fare con le funzioni di PostgreSQL e altre cose che ActiveRecord non capisce. C'è un modo per aggirare questo, però, è possibile scegliere di utilizzare un file invece di schema.rb
structure.sql
impostando:
config.active_record.schema_format = :sql
nel file config/application.rb
. Dopodiché, db:migrate
scriverà un file db/structure.sql
(che è solo un dump SQL raw del database PostgreSQL senza i tuoi dati) invece di db/schema.rb
. Potrai anche utilizzare diversi compiti Rake per lavorare con structure.sql
:
db:structure:dump
invece di db:schema:dump
db:structure:load
invece di db:schema:load
Tutto il resto dovrebbe funzionare lo stesso.
Questo approccio consente inoltre di utilizzare le altre cose nel database che ActiveRecord non capirà: Mostra vincoli, trigger, valori predefiniti colonna non ingenui, ...
fonte
2015-08-12 03:14:09
per quanto ne so non c'è modo incorporato per scrivere SQL funziona tramite Rails, ma a seconda delle funzioni, potrebbe essere meglio refactored come [scope] (http://guides.rubyonrails.org/active_record_querying.html#scopes) o altri metodi di modello. – eirikir
Tuttavia, è possibile scrivere semplicemente una classe nella directory lib che definisce le funzioni SQL. È possibile eseguire arbitrariamente SQL tramite 'ActiveRecord :: Base.connection.execute'. – eirikir
Stai cercando qualche tipo di "PL/Ruby" con supporto ActiveRecord? –