Ruby on rails 如何在Rails 3中创建仅包含计算列的模型?

Ruby on rails 如何在Rails 3中创建仅包含计算列的模型?,ruby-on-rails,database,ruby-on-rails-3.2,Ruby On Rails,Database,Ruby On Rails 3.2,我想创建一个只保存多个表中的计算值的模型 这一点已经得到了验证,但给出的解决方案仅适用于Rails 2。解决方案基本上与Ryan Bates对无表模型所做的相同。() 不幸的是,这对Rails3不起作用,因为Rails3有一种不同的方法()。(IMHO这些模型应称为无数据库模型) 我的第一个想法是使用ActiveModel方法创建一个新类,我尝试自己使用ActiveRecord::Base.connection和pure Arel来实现数据库功能,但结果证明这是一项非常艰巨的工作,所以现在我只是

我想创建一个只保存多个表中的计算值的模型

这一点已经得到了验证,但给出的解决方案仅适用于Rails 2。解决方案基本上与Ryan Bates对无表模型所做的相同。()

不幸的是,这对Rails3不起作用,因为Rails3有一种不同的方法()。(IMHO这些模型应称为无数据库模型)

我的第一个想法是使用ActiveModel方法创建一个新类,我尝试自己使用
ActiveRecord::Base.connection
和pure Arel来实现数据库功能,但结果证明这是一项非常艰巨的工作,所以现在我只是误用了另一个模型:

CompletlyUnrelatedModel.select(['SUM(...) AS sum1', 'SUM(...) AS sum2', ...])...

但这也有一些缺点。对我来说,最大的问题是返回的属性总是
String
对象(因为Rails无法查看数据库模式来确定列类型)。另外,我真的不喜欢某个模型的实例包含完全不相关的数据。

为什么不创建一个没有任何ActiveModel功能但定义了所需计算作为其类方法的简单类呢?这是我提到的第一种方法,但这样我会错过一些语法上的甜点,特别是来自
ActiveRecord::Relation
的东西,比如
select
方法,或者一般的作用域。我的意思是:你用class方法
never\u ordered
创建一个类,它返回根本没有订购的产品的计数。它的主体如下:
Product.where(…).count
。可以这样说:
Calc.never\u ordered
。而且它是无糖的:)好的,从语法角度来说,这实际上相当优雅。我没有想到这一点的原因是,计算非常昂贵(大型联接),在一个查询中获取它们要便宜得多。另一方面,我将来可能需要缓存这些值,我的模型最终会得到自己的表。:)