2016-12-20 3 views
1

Я использую Arels для создания запроса. В этом запросе я использую функцию generate_series. Вот мой код:Rails ActiveRecord Arels: Неподдерживаемый тип аргумента: String. Постройте узел Arel вместо

def generate_series 
     Arel::Nodes::NamedFunction.new('GENERATE_SERIES', [start_date, end_day, '1 day']) 
    end 

def start_date 
     Arel::Nodes::SqlLiteral.new(<<-SQL 
     CASE WHEN DATE_PART('hour', NOW() AT TIME ZONE 'ICT') < #{Time.now - 3days} THEN (CURRENT_DATE - INTERVAL '14 days') ELSE (CURRENT_DATE - INTERVAL '13 days') END 
     SQL 
    ) 
    end 

    def end_date 
     Arel::Nodes::SqlLiteral.new(<<-SQL 
     CASE WHEN DATE_PART('hour', NOW() AT TIME ZONE 'ICT') < #{Time.now} THEN (CURRENT_DATE - INTERVAL '1 day') ELSE CURRENT_DATE END 
     SQL 
    ) 
    end 

Когда я пытаюсь проверить на generate_series.to_sql. Я встречаю исключение:

Arel::Visitors::UnsupportedVisitError: Unsupported argument type: String. Construct an Arel node instead.

Я пытаюсь короче мой код для тестирования:

def generate_series 
     Arel::Nodes::NamedFunction.new('GENERATE_SERIES', ['19/11/2012', '20/11/2012', '1 day']) 
end 

Проблема в том же. Скажите, пожалуйста, как я могу исправить эту проблему.

ответ

3

Ваш последний параметр должен быть Arel::Nodes. Поэтому вы должны обернуть 1 day в Arel::Nodes:SqlLiteral. Вот обновленный код:

def generate_series 
     Arel::Nodes::NamedFunction.new('GENERATE_SERIES', 
      [start_date, end_date, Arel::Nodes::SqlLiteral.new('\'1 day\'')] 
    ) 
end 

Отметил, что вы должны также обернуть 1 day внутри скобок, то есть: '1 day'. Потому что, если вы не сделаете этого, то генерируется запрос будет:

GENERATE_SERIES(start, stop, 1 day) 

Но истинный запрос должен быть:

GENERATE_SERIES(start, stop, '1 day') 
0

Вы можете использовать Arel::Nodes.build_quoted процитировать литералов:

def generate_series 
     Arel::Nodes::NamedFunction.new('GENERATE_SERIES', 
      [start_date, end_date, Arel::Nodes.build_quoted('1 day')] 
    ) 
end 

Преимущество этого заключается в том, что вам не нужно забывать включать и исключать кавычки вручную, как вы делаете с Arel::Nodes::SqlLiteral.

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

  • Нет связанных вопросов^_^