2013-04-06 18 views

Odpowiedz

49

Tutaj spróbować tego, wybierz przykład ..:

query = "select ...." 
results = ActiveRecord::Base.connection.execute(query) 
+1

Wygląda na to, że jest to przestarzałe w przypadku wywoływania tego ze sterownika. 'OSTRZEŻENIE DEPRECACJI: #connection jest przestarzałe na rzecz uzyskiwania dostępu poprzez klasę." – Vortico

+1

jest tak, ponieważ powinieneś pozwolić modelowi na interakcję z bazą danych zamiast dostępu do bazy danych bezpośrednio w kontrolerze – ant

+0

@ant powinienem otworzyć transakcję lub otworzyć połączenie wystarcza do wykonania niestandardowego zapytania sql? [przykład pastie] (http://pastie.org/10111824) – gaussblurinc

10

W Rails 4 (chyba wcześniejsze wersje, jak również), jeśli masz zamiar z kwerendy niestandardowej dla prędkości, można dodać :skip_logging argument uniknąć pisania w dzienniku:

query = "SELECT ..." 
results = MyModel.connection.execute(query, :skip_logging) 

(Uwaga: Jeśli czytam źródła prawidłowo, to może nie uznać za prawdziwe w PostgreSQL).

+0

Jak zapobiec zastrzykom SQL? – yeyo

+5

, który sam w sobie byłby doskonałym pytaniem (chyba że już zostało odebrane) - nie zgadzasz się? –

+0

Tak, uważam, że masz rację. – yeyo

26

Wystarczy dodać moje dziesięć pensów, surowy zapytanie przy użyciu Model.connection.execute nie zwróci modelu ActiveRecord - zwróci on nieprzetworzony zestaw danych.

Poniższa powróci modeli ActiveRecord:

MyModel.find_by_sql(query) 

edit: zakładając oczywiście, że masz uruchomiony wybierz.

Powiązane problemy