Arel - Как объединить поле и строковый литерал? - PullRequest
0 голосов
/ 31 мая 2018

Я унаследовал большой сложный запрос Arel, полученный из нескольких таблиц.Новое требование гласит, что если одна из этих таблиц не имеет значения для определенного поля («район»), я должен по умолчанию установить значение «Глобальный».

Из-за высокого уровня абстракции в построении запросов и в представлении, нет хорошего способа вставить это значение по умолчанию до или после запроса.Итак, мне нужно вставить значение по умолчанию в поле в запросе Arel, если поле равно nil или нет подходящей строки.

Как я могу по умолчанию поле для строкового значения в запросе Arel?

1 Ответ

0 голосов
/ 31 мая 2018

Я нашел все части для этого поиска в сети, но не нашел все части, склеенные вместе, поэтому я делюсь этим здесь, чтобы я мог найти его снова в следующий раз!

SQL's coalesce используется для предоставления значения по умолчанию.

Чтобы получить coalesce в запросе, я использую Arel::Nodes::NamedFunction.NamedFunction позволяет вам ссылаться на любую функцию SQL, о которой Arel не знает.

Обратите внимание на одинарные кавычки в строке SqlLiteral.

supplier_table = Supplier.arel_table

district = Arel::Nodes::NamedFunction.new(
  'coalesce',
  [supplier_table[:district], Arel::Nodes::SqlLiteral.new("'Global'") ]
).as('district')

ProductHistoryResult.joins(some_join, some_other_join).select(
  [this_arel, that_arel, the_other_arel, district]
).where(product_history_request_id: id)
...