2015-08-11 24 views
10

Stiamo avviando un progetto basato su Ruby on Rails. Lavoravamo con le funzioni Perl e PostgreSQL, e con Rails e Active Record non ho visto come dovremmo creare funzioni in PostgreSQL e mantenere il record con Active Record e modelli.Posso scrivere funzioni PostgreSQL su Ruby on Rails?

So che possiamo creare manualmente in PostgreSQL, ma la "magia" con Active Record è che il database può essere ricreato con tutti i modelli.

C'è un modo per creare la funzione PostgreSQL utilizzando Rails e tenerlo nei modelli?

+0

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

+0

Tuttavia, è possibile scrivere semplicemente una classe nella directory lib che definisce le funzioni SQL. È possibile eseguire arbitrariamente SQL tramite 'ActiveRecord :: Base.connection.execute'. – eirikir

+0

Stai cercando qualche tipo di "PL/Ruby" con supporto ActiveRecord? –

risposta

24

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.rbstructure.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, ...

0

Se l'unico requisito è la loro creazione da qualche parte nell'app Rails, ciò è possibile tramite ActiveRecord::Base.connection.execute, che è possibile utilizzare per eseguire query SQL non elaborate.

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

Si potrebbe quindi chiamare la funzione utilizzando ActiveRecord::Base.connection.execute così (mi immagino che avrei dovuto metodi nel modello per gestire questa).