Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 通过ActiveRecord访问SQL计算列_Mysql_Ruby On Rails_Activerecord_Calculated Columns - Fatal编程技术网

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中的逻辑复制为
    age()
    ,并在作用域中复制为where原因。这将达到我需要的,但感觉不是很干燥

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

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

任何帮助都将不胜感激

丰富的

更新

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

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看起来很圆滑,我会检查一下。谢谢。再看看似乎更容易!