2014-01-07 2 views
3

Я хотел бы использовать метод find_by_sql вместо интерфейса запроса активной записи из-за гибкости, которую я получаю при написании собственного SQL.Rails - find_by_sql vs активная запись запросов

Например,

  1. Это считается хорошей практикой в ​​SQL для упорядочивания таблиц в запросе от наименьшего к наибольшему. При использовании интерфейса запроса активной записи вам нужно будет начать с модели результата, которая может быть самой большой таблицей.

  2. Я также могу легко избежать проблемы N + 1, включив целевую таблицу в самом соединении и включив необходимые столбцы из нескольких таблиц.

    Я хотел бы знать, есть ли причины, по которым я не должен использовать параметр find_by_sql, особенно когда я буду писать ANSI SQL, который должен быть совместим со всеми, если не в большинстве баз данных.

Спасибо!

+0

После работы с несколькими миллионами строк данных я решил, что не стоит тратить время на создание собственного SQL-кода для оптимизации. ActiveRecrod достаточно хорош, и то, что достаточно хорошо, работало для меня с несколькими миллионами строк данных. –

+0

Хорошо, спасибо. Например, когда вы используете include, он создает другой SQL за кулисами с предложением IN. AFAIK, используя «где IN», предполагается создать таблицы и, следовательно, обескураживать. –

ответ

9

Написание SQL-кода напрямую не рекомендуется, так как это предотвратит доступ к функциям, таким как ленивое выполнение SQL-запросов и потенциально может привести к недействительным или небезопасным запросам.

Фактически, ActiveRecord автоматически преобразует объекты Ruby в соответствующие операторы SQL (такие как диапазоны в BETWEEN или массивы в IN), фильтрует строки из SQL-инъекций, а ActiveRecord :: Relations обеспечивает выполнение ленивых запросов.

Если вы знаете, что вы делаете или используете ActiveRecord, было бы чрезвычайно сложно достичь определенного запроса, нет ничего плохого в написании вашего SQL.

Мое предложение состоит в том, чтобы избежать этого для запросов, которые могут быть легко воспроизведены в ActiveRecord и AREL.

+0

Я думал, что интерфейс AR AR использует AREL за кулисами. Предлагает ли AREL больше возможностей, чем интерфейс запроса? –

+0

ActiveRecord использует AREL, но не раскрывает все функции. Например, перед Rails 4 невозможно было присоединиться к другим, где условия, использующие OR, через ActiveRecord, но это было возможно с AREL. –

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