如何使模型的所有查询继承计算的sql列?

时间:2013-07-28 23:48:06

标签: ruby-on-rails ruby

我需要涉及我的Issue模型的每个查询都将另一列添加到其行中。 在我的情况下,如果问题的created_at日期从现在开始总计12小时(营业时间:上午8:00 - 下午18:00,不包括星期六和星期一),则此列为布尔值。

SELECT *, hours > 12 as alert FROM
  ( 
  SELECT *, 
        (SELECT count(*) - 1 AS work_hours
            FROM   generate_series ( created_at
                                    , now()
                                    , interval '1h') h
            WHERE  EXTRACT(ISODOW FROM h) < 6
            AND    h::time >= '08:00'::time
            AND    h::time <  '18:00'::time) as hours

  FROM issues
  ) as issues_with_alert

这将返回所有问题列,例如idtitledescription ...以及计算出的列:alert

我想创建一个sql视图issues_view并将模型上的表名更改为视图名。

self.table_name = "issues_view"

然后视图应该关注继承alert列的所有查询。

但似乎轨道没有为此做好充分准备,应该制作猴子补丁:

http://mentalized.net/journal/2006/03/27/using_sql_server_views_as_rails_tables/ 和我发现的其他问题。

另一个是在Issue模型上实现该方法:

def self.default_scope

end

但我不知道如何在其中使用SQL。

使用rails实现此目的的正确方法是什么?我想避免错误的模式和低可读性。

谢谢!

1 个答案:

答案 0 :(得分:0)

我相信你可以通过在模型中添加一个方法来解决这个问题,该方法将执行所需的计算并返回布尔值。