2011-01-21 2 views
4

MyModel.select('a, b, c').allRails 3: Включая функцию SQL в запросе

Это возвращает следующее из базы данных:

+---+---+---+ 
| 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, поскольку мне также необходимо использовать области.

Любые предложения, которые были высоко оценены.

ответ

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> 
+0

Отлично, так что вы можете! Я был смущен, поскольку это не было видно в возвращенной модели (ответ на строку 009: 0 выше). Спасибо. – gjb

Смежные вопросы