2012-05-28 1 views
3

DBMS - PostgreSQL.Rails select - нежелательный автоматический тип

В контроллере:

@data = current_user.myitems.all(:select => 'record_date, count(record_date) as value', :group => 'record_date') 

В свете:

<% @data.each do |item| -%> 
    <%= item.record_date.utc.strftime('%Y%m%d') %> 
<% end -%> 

Все работает отлично.

Но если изменить дату имя поля:

@data = current_user.myitems.all(:select => 'record_date as recdate, count(record_date) as value', :group => 'record_date') 

<% @data.each do |item| -%> 
    <%= item.recdate.utc.strftime('%Y%m%d') %> 
<% end -%> 

Я получаю сообщение об ошибке:

undefined method `utc' for "2012-02-09 17:03:47":String 

WTF ?? !! Я не приказывал набрасывать тип на строку !!!

Вы можете предложить не создавать псевдоним в строке SQL или определять псевдонимы в модели, но я не хочу менять модели для создания псевдонимов для столбцов, так как мне нужны псевдонимы только один раз и только для целей отображения. В методе контроллера есть «case», где представлены несколько заявлений выбора, , каждый со своими именами столбцов. Мне нужно, чтобы псевдонимы имели прочную точку зрения, без выражений «if».

ответ

2

Вы получаете типы ответов postgres через ftype. ActiveRecord использует эту информацию в адаптере postgres (метод #result_as_array), чтобы проверять, где должны быть экраны столбцов, тогда выбрасывает эту информацию.

Мое предположение о дальнейшем потоке данных состоит в том, что оно принимает имя столбца и использует данные, полученные посредством отражения от базы данных, до . Поскольку базовый тип - String, вы получаете это. Итак, используйте типы столбцов, которые рельсы ожидают или взломают адаптер postgres и ActiveRecord, чтобы задать типы столбцов через ftype.

tl; dr: Псевдоним на стороне Ruby (в модели где-то) AR не нравится, что вы делаете.

+0

Это была бы куча трэш, если я создам псевдонимы для каждого временного данных, в котором я нуждаюсь. Есть ли способ переименовать столбец в результирующем наборе ПОСЛЕ выбора? Или передать псевдонимы SELECT в качестве параметров? Я попробую ftype. – Paul

+0

Я не понял, зачем вам эти псевдонимы? И некоторые метапрограммирования должны оставлять след небольшим. – Reactormonk

+0

Давайте представим, что вы должны иметь несколько выборок в одном методе контроллера. Какое из них будет выполнено, зависит от входного параметра. Имена выходных столбцов должны быть одинаковыми для сохранения единого представления без инструкций CASE. – Paul

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