2016-04-27 10 views
1

Dies ist die Situation.Definieren, welche Spalten auf Modellebene von ActiveRecord abgerufen werden sollen

Eine Krankenhausdatenbank, die ich nicht kontrolliere, mit Tabellen mit bis zu 200 Spalten ... großen Spalten. Ich weiß, dass ich .select(:col1, :col2) verwenden kann, um die SQL-Ergebnismenge zu verdünnen, aber in einer Beziehung .... Patient.select(:full_name).find[a,b,c,d.....].include(:visits) ... wo Besuche hat 168 Spalten und ich brauche nur stationäre und ambulante Spalten und beobachtete eine Select * auf den Protokollen, nur tut weh und dauert ewig, um zu laden.

Gibt es eine Möglichkeit, in der Klasse festgelegt, welche Spalten in das Modell aufzunehmen?

etwas sagen wie (ich dies nur bilden)

class Foo < ActiveRecord::Base 
    select_columns = [:id, :inpatient_date, :outpatient_date] 
    ... 
end 

So, dass jeder in der Datenbank durchgeführt Abrufs verwendet nur die Spalten auf der Select-Anweisung?

Antwort

1

Sie können einen Standardbereich verwenden:

class Foo < ActiveRecord::Base 
    default_scope: -> { select(:id, :inpatient_date, :outpatient_date) } 
    ... 
end 

Beachten Sie, dass dies nur Abfragen auswirken wird, die Sammlungen von Objekten zurückgeben, wie where, etc. Alle Spalten noch verfügbar sein, wenn ein einzelnes Objekt wie Foo.find() verweisen.

1

Sie können pluck Methode verwenden.

Etwas wie:

Patient.includes(:visits).pluck("patients.id, patients.name, visits.inpatient_date, visits.outpatient_date") 

Dies wird wieder so etwas wie:

SELECT patients.id, patients.name, visits.inpatient_date, visits.outpatient_date FROM "Patienten" LEFT OUTER JOIN " " " " "Besuche“ON" Patienten-ID"=" Besuche patient_id"

Mehr Informationen über pluck Methode, finden sich hier: http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-pluck

+0

Versucht, dass ... es ein Array zurückgibt. Ich brauche noch ein Modell. Danke. –

Verwandte Themen