Mysql 通过ActiveRecord访问SQL计算列
我有一个Mysql 通过ActiveRecord访问SQL计算列,mysql,ruby-on-rails,activerecord,calculated-columns,Mysql,Ruby On Rails,Activerecord,Calculated Columns,我有一个Person模型,其中包括一个表示出生数据的属性(birth\u date) 我还有一个名为age()的方法,可以计算出此人的当前年龄 我现在需要根据人的年龄运行查询,因此我将age()的逻辑复制为MySQL中的计算列 我无法确定如何使此附加列成为模型默认select语句的一部分 我希望能够像访问Person模型的本地属性一样访问age,对其执行查询并访问视图中的值 这是可能的,还是我找错树了 我想我可以通过default\u scope或scope定义其他字段,但这些方法似乎只能识别现
Person
模型,其中包括一个表示出生数据的属性(birth\u date
)
我还有一个名为age()
的方法,可以计算出此人的当前年龄
我现在需要根据人的年龄运行查询,因此我将age()
的逻辑复制为MySQL中的计算列
我无法确定如何使此附加列成为模型默认select语句的一部分
我希望能够像访问Person模型的本地属性一样访问age,对其执行查询并访问视图中的值
这是可能的,还是我找错树了
我想我可以通过default\u scope
或scope
定义其他字段,但这些方法似乎只能识别现有字段。我还尝试了default\u scope
与attr\u assessor
一起使用
我已经考虑过可能的解决办法,但不愿意:
- 创建一个名为
的实际属性,并通过使用回调进行填充。日期总是在变化,所以这显然是可靠的age
- 将ActiveRecord中的逻辑复制为
,并在作用域中复制为where原因。这将达到我需要的,但感觉不是很干燥age()
- 我已经在缓存
方法的结果。我最感兴趣的是在where子句中使用字段的能力age()
default_scope :select => "*, 2 as age"
attr_accessor :age
age
是空的,我假设是因为作用域只处理限制,而不是扩展。kim3er您的问题解决方案很简单。遵循以下步骤:
从您的模型中松开attr\u访问器:age
。你根本不需要它
将默认范围保留在Person
model:default\u范围:选择=>“*,2作为年龄”
最后打开一个控制台并尝试
p = Person.first
p.age
=> 2
当您使用as定义select时,Rails
将自动为您在实例上添加这些方法!那么你的问题的答案是:
必须有一种通过SQL定义动态字段的方法,默认情况下,我可以通过模型访问该方法
是:
轨道
我不是专家,但你似乎想:
class Person < ActiveRecord::Base
scope :exact_age, lambda { |a| where('age = ?', a) }
scope :age_gt, lambda { |a| where('age > ?', a) }
class-Person?',a)}
尽管如此,我刚刚开始研究,似乎很酷请展示一些代码。您是否为其他属性设置了一些别名,如
select('expression AS alias')
?@taro,我添加了一个示例。我认为,不需要attr_访问器声明。很好,但我不关心奖励:)@kim3er:您可以在中的命名范围中阅读lambda函数。对于您的问题,它将是:scope:age,lambda{| age |:conditions=>[“age(birch_date)>?”,age]}
。或者使用其中一个来计算此范围内的实际年龄。谢谢Gerry@taro已经在上面的评论中回答了我的问题,但我感谢您提供的额外上下文,因此我将把问题标记为已回答。+1谢谢@Michael K Madison,Arel看起来很圆滑,我会检查一下。谢谢。再看看似乎更容易!