I am using TIMESTAMPDIFF in select using the below ActiveRecord query, but it is not giving the correct result.
1.
Job.where(id: [1,2])
.group(:user_level)
.select("user_level, SUM((TIMESTAMPDIFF(MINUTE, start_datetime, end_datetime) - unpaid_break_time) / 60 * hourly_rate) AS income")
2.
Job.select("user_level, SUM((TIMESTAMPDIFF(MINUTE, start_datetime, end_datetime) - unpaid_break_time) / 60 * hourly_rate) as income")
.where(id: [1,2]).group(:user_level)
3.
Job.find_by_sql("
SELECT user_level, SUM((TIMESTAMPDIFF(MINUTE, start_datetime,end_datetime) - unpaid_break_time)/60 * hourly_rate) as income
FROM jobs
WHERE id IN (1,2)
GROUP BY user_level
")
All three are giving same result i.e. [#<Job id: nil, user_level: 0.33e1>]
Expected: [{user_level: 0.33e1, income: 34}]
If I execute the SQL generated from above 3 in Workbench , I got the correct result. So, query is correct.
Also, If I use, pluck instead of select, I got the correct result but in Array as pluck returns array.
Job.where(id: [1,2]).group(:user_level)
.pluck("user_level, sum(((TIMESTAMPDIFF(MINUTE, start_datetime,end_datetime) - unpaid_break_time)/60 * hourly_rate)) as income")
So, how to use Select to get the expected output?
Note: In above query, id: 1,2 are just for example, the actual ids are different.
Did you try calling
.incomeon the job (#<Job id: nil, user_level: 0.33e1>)?Rails takes all the returned columns and assigns them to the record, but only displays attributes that the model actually has in the default
.inspectthat the console shows.Calling
.attributeson the job should also give you the income in a hash.