kim*_*3er 5 mysql activerecord ruby-on-rails calculated-columns
我有一个Person模型,其中包含一个表示出生数据的属性 ( birth_date)。
我还有一个方法叫做age(),它计算出这个人的当前年龄。
我现在需要根据人的年龄运行查询,所以我age()在 MySQL 中复制了作为计算列的逻辑。
我无法练习如何将这个附加列作为模型的默认选择语句的一部分。
我希望能够访问年龄,就好像它是 Person 模型的本机属性一样,对它执行查询并访问我视图中的值。
这是可能的,还是在吠错树?
我以为我可以通过default_scope或定义其他字段scope,但这些方法似乎只能识别现有字段。我也尝试default_scope与attr_assessor.
我已经考虑过但不想这样做的可能解决方法:
创建一个实际的属性,调用age并通过使用回调填充。日期总是在变化,所以这显然是可靠的。
将 ActiveRecord 中的逻辑复制为age()一个范围作为 where 原因。这将实现我所需要的,但不会感觉很干。
我已经在缓存该age()方法的结果。我最感兴趣的是在 where 子句中使用该字段的能力。
必须有一种方法可以通过 SQL 定义动态字段,默认情况下我可以通过模型访问该字段。
任何帮助,将不胜感激。
富有的
更新
我尝试使用范围失败的一个例子:
default_scope :select => "*, 2 as age"
attr_accessor :age
Run Code Online (Sandbox Code Playgroud)
age 是空白的,我假设是因为范围只处理限制,而不是扩展。
kim3er 你的问题的解决方案很简单。按着这些次序:
从您的模型中松开attr_accessor :age。你根本不需要它。
保留模型的默认范围Person:default_scope :select => "*, 2 as age"
最后打开控制台并尝试
p = Person.first
p.age
=> 2
Run Code Online (Sandbox Code Playgroud)
当您使用 as 定义选择时,Rails将自动为您在实例上添加这些方法!所以你的问题的答案是:
必须有一种通过 SQL 定义动态字段的方法,默认情况下我可以通过模型访问该动态字段。
是:
导轨