2014-01-28 4 views
0

Могу ли я создать представление postgresql из приведенного ниже кода? Это необходимо ?, потому что теперь для загрузки требуется несколько секунд, но в будущем мне придется добавить на него диапазон дат. Если да, может кто-нибудь помочь мне написать это, пожалуйста.Rails создать представление из активной записи

report = self.project_reports 
    results_total = report.where('value < ?', 50).group("key_id").select('key_id') 
    fifty = report.where('value BETWEEN ? AND ?', 41, 50).group("key_id").select('key_id') 
    forty = report.where('value BETWEEN ? AND ?', 31, 40).group("key_id").select('key_id') 
    thirty = report.where('value BETWEEN ? AND ?', 21, 30).group("key_id").select('key_id') 
    twenty = report.where('value BETWEEN ? AND ?', 11, 20).group("key_id").select('key_id') 
    ten = report.where('value BETWEEN ? AND ?', 4, 10).group("key_id").select('key_id') 
    three = report.where('value = ?', 3).group("key_id").select('key_id') 
    two = report.where('value = ?', 2).group("key_id").select('key_id') 
    one = report.where('value = ?', 1).group("key_id").select('key_id') 
    pos = {fif: fifty.count.size, four: forty.count.size, thir: thirty.count.size, twen: twenty.count.size, te: ten.count.size, thr: three.count.size, tw: two.count.size, on: one.count.size, result_t: total} 

ответ

1

Это будет настоящий «вид» в том смысле, SQL (вы можете только создать что с помощью запроса DDL), но вы, конечно, можно построить ActiveRelation (который, вероятно, что вы имели в виду, так или иначе). Обратите внимание, что вы переключаетесь между «значением» и «положением» произвольно, это специально? Я использую «значение» для согласованности ради здесь:

group_sql = <<-SQL 
    CASE WHEN value = 1 THEN 'one' 
     WHEN value = 2 THEN 'two' 
     WHEN value = 3 THEN 'three' 
     WHEN value <= 10 THEN 'ten' 
     WHEN value <= 20 THEN 'twenty' 
     WHEN value <= 30 THEN 'thirty' 
     WHEN value <= 40 THEN 'forty' 
     WHEN value <= 50 THEN 'fifty' 
SQL 
report = self.project_reports.where('value < 50').group(group_sql) 
positions = report.count 
positions['total'] = positions.values.sum 
+0

http://alexpotrykus.com/blog/2013/04/10/postgres-views-in-rails/ это не вид? – John

+0

Если вы просмотрите эту статью, вы увидите, что фактический вид не появляется до перехода, который начинается с 'create or replace view ...'. Это утверждение создает представление. Выполнение произвольного запроса может быть использовано аналогично представлению, но оно устраняет гибкость в отношении производительности. Обычно вы не начинаете использовать представление, пока не убедитесь, что преимущества в производительности оправдывают трудности в ремонтопригодности. Либо это, либо если вам нравится сложный код: :) В этом случае я пока не вижу причины переходить к реальному виду (материализованному или нет). – PinnyM

Смежные вопросы