Rails 3:在查询中包含SQL函数

时间:2011-01-21 22:31:26

标签: ruby-on-rails ruby-on-rails-3

MyModel.select('a, b, c').all

这将从数据库中返回以下内容:

+---+---+---+
| a | b | c |  
+---+---+---+
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
+---+---+---+

问题:如何在SQL函数的结果中包含第四列?

+---+---+---+---------------------+
| a | b | c | MYFUNCTION(a, b, c) |
+---+---+---+---------------------+
| 1 | 2 | 3 | 123                 |
| 4 | 5 | 6 | 456                 |
| 7 | 8 | 9 | 789                 |
+---+---+---+---------------------+

以下不起作用:

MyModel.select('a, b, c, MYFUNCTION(a, b, c)').all

但是,如果我使用AS为列提供有效模型属性的名称,则可以使用:

MyModel.select('a, b, MYFUNCTION(a, b, b) AS c').all

+---+---+-----+
| a | b |  c  |
+---+---+-----+
| 1 | 2 | 122 |
| 4 | 5 | 455 |
| 7 | 8 | 788 |
+---+---+-----+

我更愿意在模型的上下文中解决这个问题,而不是恢复到原始SQL,因为我还需要使用范围。

任何建议都非常感谢。

1 个答案:

答案 0 :(得分:2)

您可以为AS列指定任意名称,而不是提供现有属性。

irb(main):009:0> u = User.select('id, id+1 as blah').first
=> #<User id: 1>
irb(main):010:0> u.id
=> 1
irb(main):011:0> u.blah
=> 2
irb(main):012:0>