数据库
首页 > 数据库> > mysql – 通过ActiveRecord访问SQL计算列

mysql – 通过ActiveRecord访问SQL计算列

作者:互联网

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

我还有一个名为age()的方法,它可以解决当前人的年龄问题.

我现在需要根据人的年龄来运行查询,因此我将age()的逻辑复制为MySQL中的计算列.

我无法训练如何将此附加列作为模型的默认select语句的一部分.

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

这可能,或者是在错误的树上吠叫?

我以为我可以通过default_scope或scope定义其他字段,但这些方法似乎只能识别现有字段.我还尝试将default_scope与attr_assessor一起使用.

可能的解决方法我考虑过但不愿意这样做:

>创建一个名为age的实际属性,并通过使用回调填充.日期总是在变化,所以这显然是可靠的.
>将ActiveRecord中的逻辑复制为age(),并将范围复制为where cause.这将实现我的需要,但感觉不是很干.
>我已经缓存了age()方法的结果.它是在我最感兴趣的where子句中使用该字段的能力.

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

任何帮助,将不胜感激.

丰富

UPDATE

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

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

attr_accessor :age

年龄是空白的,我假设因为范围只涉及限制,而不是扩展.

解决方法:

kim3er你的问题解决方案很简单.跟着这些步骤:

从模型中松开attr_accessor:age.你根本就不需要它.

保留Person模型的默认范围:default_scope:select => “*,2岁作为年龄”

最后打开一个控制台试试

p = Person.first
p.age
=> 2

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

There must be a way to define dynamic fields through SQL that I can access through the model by default.

是:

Rails

标签:mysql,ruby-on-rails,activerecord,calculated-columns
来源: https://codeday.me/bug/20190630/1338040.html