2016-02-10 181 views
1

我正在尝试使用ActiveRecord进行下一个查询,并且不知道如何实现此SQL结果而不使用find_by_sql调用。ActiveRecord与嵌套表查询

SELECT * 
FROM table_x AS a, 
    (SELECT locator, max(day_parsed) AS max_day 
    FROM table_x 
    WHERE day_parsed BETWEEN params[:day_from] AND params[:day_to] 
    GROUP BY locator) AS b 
WHERE a.locator = b.locator 
AND a.day_parsed = b.max_day 

任何想法?

+0

出了什么问题'find_by_sql'?为什么要将可读的SQL查询转换为不可读的'ActiveRecord'代码? –

+0

'find_by_sql'返回'Hash'。理想情况下,我想创建一个基于此结果的ActiveRecord模型。我试着用postgresql视图,但因为我需要使用数据库视图丢弃的日期范围参数。什么是错误的是,我不能使用active_record关联 –

+0

例如,我想使用基于此结果的范围。 –

回答

2

例如,我们有活动记录TableX和表名是table_x,所以查询将是:

from = params[:day_from] 
to = params[:day_to] 

TableX.joins("JOIN (
        SELECT locator, max(day_parsed) AS max_day 
        FROM table_x 
        WHERE day_parsed BETWEEN #{from} AND #{to} 
        GROUP BY locator 
        ) as b ON b.locator = table_x.locator") 
     .where("table_x.day_parsed = b.max_day") 
+0

我都工作得很好,除了参数 –

+0

'params [:day_from]'和'params [:day_to]'的值是什么? –

+0

例如“20010101”和“20160301” –