2016-02-01 1 views
0

Я обновляю проект с Rails 3.2 до Rails 4.0, и я пытаюсь исправить проблему, вызывающую предупреждение об устаревании. Предупреждение вызвано запросом, как этот:Исправить предупреждение об устаревании: where() с саморефлексирующим SQL, но также использует включает()

email = Email. 
    includes(:person). 
    where("lower(email) = ? ", login_email.downcase). 
    first 

Здесь «письмо» таблица имеет строковый столбец «электронную почту», который содержит адрес электронной почты.

Предупреждение об исключении - это Rails 4, который говорит, что, поскольку я использую where() с строкой SQL, и я использую include() для загрузки с нетерпением, я должен использовать ссылки() для выполнения правильной работы присоединяется, так что рельсы не должны анализировать SQL для определения соединения. В этом случае SQL, который я использую, ссылается на модель, с которой я запрашиваю, а не на ассоциацию, поэтому нет соединения с SQL. Чтобы отключить предупреждение, я был соблазн сделать следующий немного нонсенс, говоря о том, что ссылки присоединиться является модель запрашивая:

email = Email. 
    includes(:person). 
    where("lower(email) = ? ", login_email.downcase). 
    references(:emails). 
    first 

Но это не молчание предупреждение устаревания.

Проблема в двух словах: я вызываю where() с SQL, который ссылается на модель, с которой я запрашиваю, я использую include() для загрузки данных из таблицы, не связанной с вышеупомянутым SQL, но Меня спрашивают использовать ссылки() в ситуации, когда это не применяется.

Любые советы по устранению проблемы, вызывающей предупреждение об утомлении в этом случае? Наконечник, предоставленный самим предупреждением, на самом деле не применяется.

Приветствие, Chris

+0

возможно квалифицировать имя столбца ('lower (emails.email)')? –

ответ

0

Вы можете включить предупреждение устаревания выходное в среду ... но я бы не рекомендовал, что (особенно в развитии/тест, где они полезны предупреждения).

Возьмите gander в this discussion, чтобы увидеть альтернативы. В противном случае, я бы посоветовал исправить предупреждение об устаревании (использовать новый синтаксис) и избежать отмены устаревших.

+0

Спасибо daino3. Я определенно предпочел бы исправить проблему, а не замолчать предупреждение, я должен изменить свой вопрос, чтобы это отразить. –

+0

ОК, можете ли вы попробовать «Email.includes (: person) .where (« lower (emails.email) =? », Login_email.downcase) .first' ... и если это не сработает, ссылки (: сообщения электронной почты) '. Я думаю, что строка SQL считает, что столбец «email» неоднозначен среди двух таблиц. – daino3

+0

Еще раз спасибо daino3. К сожалению, вы предлагаете не останавливать предупреждение об устаревании. Я нашел способ заставить замолчать предупреждение, добавив в цепочку вызовов «.joins (: person)». Это немного для меня, потому что, хотя в этом случае это нечестно, это не универсально, и я только делаю это, чтобы заставить замолчать предупреждение. –

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