My Association is like this
- field has_many field_values
- field_value belongs_to field
I am querying field_values table to get field_values grouped by field_id like this:
def field_values
FieldValue.where(field_id: @field_ids)
.pluck(:id, :value, :field_id, :active, :old_value)
.map { |obj| { id: obj[0], value: obj[1], field_id: obj[2],
active: obj[3], old_value: obj[4] } }
.group_by { |a| a[:field_id] }
end
Above method executes this SQL which takes 20ms to fetch 30k records
SELECT id, value, field_id, active, old_value FROM field_values WHERE field_id IN (85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 117, 118, 119);
And then constructing my @shared_fields obj to insert field_values in it:
@shared_fields
{
id: 1
field:
{
id: 11,
field_values:
[
{
id: 111,
value: 'abc',
field_id: 11,
active: true,
old_value: nil
}
{
id: 112,
value: 'pqr',
field_id: 11,
active: true,
old_value: nil
}
]
}
}
def construct_obj
field_values.each do |id, values|
sh_field = @shared_fields.detect { |shf| shf[:field][:id] == id }
next unless sh_field
sh_field[:field][:field_values] = values
end
end
- field_values method is taking 20 ms to fetch 30k records
- construct_obj method is taking around 170 ms to complete the processing.
Any thoughts on how we can optimize the sql query and also looping over the grouped object which is taking 170 ms.