2012-06-19 11 views
6

sto eseguendo la seguente query SQL prima di uno dei miei regolatori:Ruby on Rails - Dynamic query SQL

active_users_query = <<-SQL 
     SELECT count(DISTINCT patients.id) 
     FROM public.patients, public.subscriptions, public.users, public.calendar_days 
     WHERE patients.user_id = users.id 
     AND patients.id = calendar_days.patient_id 
     AND subscriptions.user_id = patients.user_id 
     AND (date_trunc('day',patients.last_sync) > current_date - interval '30 days' 
     OR date_trunc('day', calendar_days.created_at) > current_date - interval '30 days' 
     OR date_trunc('day',users.current_sign_in_at) > current_date - interval '30 days') 
     AND subscriptions.code_id = 2 
SQL 

C'è un modo per aggiungere un po 'di codice RoR per l'ultima riga di questa query per generare codice_id in modo dinamico?

Qualcosa di simile a questo:

AND subscriptions.code_id = '@subscription.code' 

risposta

10

È possibile interpolare variabili di Ruby nelle stringhe heredoc

active_users_query = <<-SQL 
     SELECT count(DISTINCT patients.id) 
     FROM public.patients, public.subscriptions, public.users, public.calendar_days 
     WHERE patients.user_id = users.id 
     AND patients.id = calendar_days.patient_id 
     AND subscriptions.user_id = patients.user_id 
     AND (date_trunc('day',patients.last_sync) > current_date - interval '30 days' 
     OR date_trunc('day', calendar_days.created_at) > current_date - interval '30 days' 
     OR date_trunc('day',users.current_sign_in_at) > current_date - interval '30 days') 
     AND subscriptions.code_id = '#{@subscription.code}' 
SQL 
+0

funzionato come un fascino. Grazie !! – Myxtic