通过 ActiveRecord 访问 SQL 计算列

kim*_*3er 5 mysql activerecord ruby-on-rails calculated-columns

我有一个Person模型,其中包含一个表示出生数据的属性 ( birth_date)。

我还有一个方法叫做age(),它计算出这个人的当前年龄。

我现在需要根据人的年龄运行查询,所以我age()在 MySQL 中复制了作为计算列的逻辑。

我无法练习如何将这个附加列作为模型的默认选择语句的一部分。

我希望能够访问年龄,就好像它是 Person 模型的本机属性一样,对它执行查询并访问我视图中的值。

这是可能的,还是在吠错树?

我以为我可以通过default_scope或定义其他字段scope,但这些方法似乎只能识别现有字段。我也尝试default_scopeattr_assessor.

我已经考虑过但不想这样做的可能解决方法:

  • 创建一个实际的属性,调用age并通过使用回调填充。日期总是在变化,所以这显然是可靠的。

  • 将 ActiveRecord 中的逻辑复制为age()一个范围作为 where 原因。这将实现我所需要的,但不会感觉很干。

  • 我已经在缓存该age()方法的结果。我最感兴趣的是在 where 子句中使用该字段的能力。

必须有一种方法可以通过 SQL 定义动态字段,默认情况下我可以通过模型访问该字段。

任何帮助,将不胜感激。

富有的

更新

我尝试使用范围失败的一个例子:

default_scope :select => "*, 2 as age"

attr_accessor :age
Run Code Online (Sandbox Code Playgroud)

age 是空白的,我假设是因为范围只处理限制,而不是扩展。

Ger*_*rry 4

kim3er 你的问题的解决方案很简单。按着这些次序:

从您的模型中松开attr_accessor :age。你根本不需要它。

保留模型的默认范围Persondefault_scope :select => "*, 2 as age"

最后打开控制台并尝试

p = Person.first
p.age
=> 2
Run Code Online (Sandbox Code Playgroud)

当您使用 as 定义选择时,Rails将自动为您在实例上添加这些方法!所以你的问题的答案是:

必须有一种通过 SQL 定义动态字段的方法,默认情况下我可以通过模型访问该动态字段。

是:

导轨