2016-08-10 2 views
1

я получил модель вызова Answer, а вот его столRails использовать SQL group_by

id  group_id qset_id 
1  123   1 
2  123   2 
3  123   1 
4  456   1 
5  456   1 
6  456   3 

мне нужно вернуться формат с array или json включают все group_id и их различное qset_id

Может быть, как это

class: [ 
    { 
     "group_id": 123 
     "qset_id": [1,2] 
    }, 
    { 
     "group_id": 456 
     "qset_id": [1,3] 
    } 
] 

Я думал о group_by, но я uck здесь. И таблица очень большая, есть ли эффективный способ Rails справиться с этим?

ответ

1

Вы пробовали это?

@answer = Answer.all.group_by(&:group_id) 

@answer.each_with_index do |answer, index| 
    { 
    'group_id': index, 
    'qset_id: answer.flatten.map{|x| x_id} 
    }  
end 

I have to tell that I had to study more query sql to find this solution 

ActiveRecord::Base.connection.exec_query('SELECT group_id, GROUP_CONCAT(qset_id) FROM answers GROUP BY group_id').rows.to_h 

Я создал тест здесь для этого, и я получил правильный ответ.

[email protected] (main)> ActiveRecord::Base.connection.exec_query('SELECT proposal_id, GROUP_CONCAT(DISTINCT unit_id) FROM bookings GROUP BY proposal_id').rows.to_h 
    SQL (0.2ms) SELECT proposal_id, GROUP_CONCAT(DISTINCT unit_id) FROM bookings GROUP BY proposal_id 
=> {1=>"2,3", 3=>"4", 4=>"5", 5=>"6"} 
+0

Я не уверен, потому что это заняло много времени, и результат не показал. «Ответ» очень большой (более 10 миллионов записей) –

+0

Итак, вам нужно сделать это действие непосредственно в sql –

+0

Можете ли вы дать мне подсказку? –

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