В моей таблице/модели есть столбец типа TEXT
, и при фильтрации для записей самой модели AR, where
выдает правильный SQL и возвращает правильные результаты, вот что я имею в виду:
MyNamespace::MyValue.where(value: 'Good Quality')
Производит этот SQL:
SELECT 'my_namespace_my_values'.*
FROM 'my_namespace_my_values'
WHERE 'my_namespace_my_values'.'value' = '\\\"Good Quality\\\"'
Возьмем другой пример, когда я присоединяюсь к MyNamespace::MyValue
и фильтруюсь в одном столбце value
но из другой модели (имеет отношение к модели к my_values
). См. Это (запрос № 2):
OtherModel.joins(:my_values).where(my_values: { value: 'Good Quality' })
Это не приводит к правильному запросу, поэтому он фильтрует столбец value
как если бы это был столбец String, а не Text, поэтому приводил к неправильным результатам (только вставляя соответствующие значения):
WHERE my_namespace_my_values'.'value' = 'Good Quality'
Теперь я могу обойти это, сделав LIKE внутри моего AR, where
будет создан правильный результат, но немного другой запрос. Это то, что я имею в виду:
OtherModel.joins(:my_values).where('my_values.value LIKE ?, '%Good Quality%')
Наконец, добравшись до моих вопросов. Что это такое и как оно создается для того, где в модели (для текстового столбца)?
WHERE 'my_namespace_my_values'.'value' = '\\\"Good Quality\\\"'
Возможно, самый важный вопрос: в чем разница в показателях производительности, используя:
WHERE 'my_namespace_my_values'.'value' = '\\\"Good Quality\\\"'
и это:
(my_namespace_my_values.value LIKE '%Good Quality%')
и что еще более важно, как я могу получить свой запрос с объединениями (запрос № 2), где:
WHERE 'my_namespace_my_values'.'value' = '\\\"Good Quality\\\"'