5

Pracuję nad projektem, w którym jestem projektantem baz danych/administratorem w środowisku PostgreSQL. Lider zdecydował się użyć Railsów do logiki aplikacji i zrekrutował programistę Rails.Wywołanie procedur przechowywanych PL/pgSQL z Ruby on Rails

Programista Railsów powiedział, że zazwyczaj programuje cały kod aplikacji i nie lubi braku kontroli, którą daje mu przekazanie mu procedury przechowywanej, i że nigdy nie robił tego w szynach.

Baza danych wykorzystuje dużo dziedziczenia/EERM, więc procedury przechowywane i wyzwalacze znacznie ułatwią jego pracę, oprócz korzyści wynikających z używania proc.

Mam cztery pytania:

1) Jak wywołać PL/PGSQL procedury przechowywanej z Rails bez wartości zwracanej

2) Jak nazywają PL/PGSQL procedury przechowywanej z Rails z pojedynczym zwracana wartość (1 wiersz/1 kolumna)

3) Jak wywołać procedurę przechowywaną pl/pgSQL z Railsów z 1 wierszem wiele wartości zwracanych przez kolumnę.

4) Jak wywołać procedurę przechowywaną w pl/pgSQL z Rails przy użyciu parametru OUT?

Dzięki!

+6

Będziesz mieć zły czas, chyba że może przekonać twojego programistę Railsa do użycia czegoś takiego jak [Sequel] (http://sequel.rubyforge.org). Domyślny Rails ORM (ActiveRecord) nie wierzy, że baza danych powinna zawierać jakąkolwiek logikę i nie rozumie niczego bardziej skomplikowanego niż 'select *' i proste sprzężenia, będziesz walczyć z nim cały czas, jeśli naruszysz konwencje przez używanie "wymyślnych" rzeczy, takich jak wyzwalacze, procedury przechowywane, a nawet przygotowywane wyciągi. –

+2

Tak ... DB i ActiveRecord oparte na procesach i dziedziczeniu poprowadzą Cię prosto na http://thedailywtf.com/ terytorium. Musisz żyć z decyzją, aby przejść do Railsów (i prawdopodobnie jego ORR ActiveRecord) i wyrzucić twój projekt DB przez okno, a następnie zrobić taki, który następuje po koneksjach ActiveRecord (bez głupich rzeczy, takich jak "obce klucze" lub "ograniczenia", kto i tak by ich chciał?). Ewentualnie zmień decyzję i sprawdź, czy jako notatki Mu możesz uzyskać przynajmniej przy użyciu zdrowej ORM. –

Odpowiedz

7

Witam Używam tego kodu do pracy z procedur przechowywanych PgSQL ta obejmuje wszystko z wyjątkiem ostatniego pytania

class SpActiveRecord < ActiveRecord::Base 

     self.abstract_class = true 
     #without return value 
     def self.execute_sp(sql, *bindings) 
     perform_sp(:execute, sql, *bindings) 
     end 
     #select many return values 
     def self.fetch_sp(sql, *bindings) 
     perform_sp(:select_all, sql, *bindings) 
     end 
     #select single return value 
     def self.fetch_sp_val(sql, *bindings) 
     perform_sp(:select_value, sql, *bindings) 
     end 

     protected 
     def self.perform_sp(method, sql, *bindings) 
     if bindings.any? 
      sql = self.send(:sanitize_sql_array, bindings.unshift(sql)) 
     end 
     self.connection.send(method, sql) 
     end 

    end 

Przykład

class Invoice < SpActiveRecord 

def create_or_update 
     raise ReadOnlyRecord if readonly? or !new_record? 

     self.id = fetch_sp_val("SELECT * FROM billing.invoice_generate(?,?,?)", 
           self.account_id, 
           self.start_date, 
           self.end_date) 

     @new_record = false 
     true 
    end 
end