Моя таблица / модель имеет столбец типа 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
).Смотрите это ( query # 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\\\"'