0

我有一个方法工作得很好(使用rails 3和PostgreSQL);我只是想知道是否有可能使其数据库无关:ActiveRecord聚合函数:是否有一个数据库不可知的'EXTRACT(WEEK from date)'?

 
FarmGatePrice.average :price, :group => 'EXTRACT(WEEK FROM date)' 

据我了解,方法来提取日期一周ISO数值总是特定的数据库。

我可以使用类似虚拟属性:本周所看到here,但似乎:组选项只接受原始的SQL。我也看过this solution,但它不符合我的需求。 另一种方法是使用数据库视图,甚至可以添加一个由回调方法填充的周列:但我不希望混淆我的模式。

那么,任何线索?

回答

1

都能跟得上 - 如果你需要每周做一组,你最好直接在数据库中保存为通过before_save回调设置一个额外的列。

正如你所说,从日期提取一个星期是不平凡的,所以最好还是让Rails的处理这个问题,而不是你的数据库。这也会提高性能。

更新:

例回调:

def Thing 

    before_save :set week 

    private 
    def set_week 
     self.week = self.date.cweek 
    end 
end 
+0

对不起,但是当你说这会提高性能,我不明白这一点。存储过程是否应该更好? ...并且它不回答问题的“如何”部分。 –

+1

我怀疑存储过程会像简单整数列上的索引一样快。此外,存储过程意味着把你的业务逻辑放到你的数据库中 - 这不是Rails的方式(做一些谷歌搜索读取围绕它的参数)。用示例回调更新了答案。 –

+0

感谢您的示例。 –