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