передача имени столбца в качестве переменной в запрос ActiveRecord - PullRequest
1 голос
/ 24 мая 2019

Допустим, у меня есть запрос:

Foo.where("lower(bar) LIKE ?", "%#{baz}%")

, который преобразуется в простой SQL как:

    ... WHERE (lower(bar) LIKE ...

и работает отлично. Но вместо bar я хочу передать аргумент. Поэтому я попытался переписать это так:

Foo.where("lower(?) LIKE ?", bar, "%#{baz}%")

где bar - переменная, содержащая строку 'bar'. В этом случае он перестает работать и преобразуется в простой SQL как:

... WHERE (lower('bar') LIKE ...

Так, как я могу заставить этот запрос работать?

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Вы можете построить свой запрос через Арель:

bar = :field_name # or 'string_name'.to_sym
Foo.where(Foo.arel_table[bar].lower.matches("%#{baz}%"))
1 голос
/ 24 мая 2019

Возможно, вы захотите попробовать использовать в шаблоне символ% sprintf-style, чтобы избежать цитирования имени столбца, который вы хотите интерполировать:

Foo.where("lower(%s) LIKE '%s'", bar, "%#{baz}%")

(NB Одинарные кавычки вокруг второй %s - второй аргумент хочет быть заключен в кавычки)

Ссылка :

Наконец, вы можете использовать% escpes-style sprintf в шаблоне.Это работает немного иначе, чем предыдущие методы;Вы несете ответственность за правильное цитирование значений в шаблоне.Значения передаются соединителю для цитирования, но вызывающий отвечает за то, чтобы они были заключены в кавычки в результирующем SQL.После кавычек значения вставляются с использованием тех же escape-кодов, что и для ядра Ruby: Kernel :: sprintf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...