Нужно ли переписывать этот SQL-запрос в Rails ActiveRecord? - PullRequest
0 голосов
/ 01 ноября 2011

Продукты продаются на веб-сайте в течение ограниченного периода времени.

Каждая продажа начинается с DATE, заканчивается на DATE и содержит хотя бы один продукт.

Каждый продукт связан с идентификатором № продажи, к которой он принадлежит.

Иногда существует короткий период времени, в течение которого нет товаров внутри продажи, потому что менеджер создал продажу, но не завершил привязку продуктов кпродажи пока нет, поэтому я должен отфильтровывать продажи без каких-либо продуктов внутри при отображении списка предстоящих продаж, или это сбивает с толку пользователей.

В моей модели Sale я придумал это, когдаЯ не очень знаком с ActiveRecord:

def upcoming_sales
    find_by_sql(["SELECT DISTINCT sales.* from sales, products WHERE products.sale_id = sales.id AND sales.start_at > ? AND sales.start_at < ? ORDER BY sales.start_at ASC", Time.now, (Time.now + END_AT)])
end

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

Помимо того, что он удобен для пользователей, не являющихся пользователями SQL, есть ли какие-либо преимущества в переделке с помощью ActiveRecord?

Какой способ лучше с точки зрения производительности?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

Конечно, вы можете написать собственный SQL, но это не рекомендуется, когда AR работает просто отлично (вы получите однородный чистый код, независимый от DB, ...):

def upcoming_sales
  select('DISTINCT sales.*').
    joins(:products).
    where(["sales.start_at > ? AND sales.start_at < ?", Time.now, Time.now + END_AT]).
    order("sales.start_at ASC")
end
2 голосов
/ 01 ноября 2011

Необработанный SQL сложно поддерживать.Производительность, безусловно, лучше, чем raw sql, но учтите следующие преимущества ActiveRecord.Вы получаете хороший синтаксис запросов, который гораздо более читабелен, если учесть, что есть другие, которым может понадобиться изменить ваш код.Кроме того, ActiveRecord позволяет вам не зависеть от механизма базы данных в такой степени, которая была бы невозможна при использовании raw sql.

Но, если вы рассматриваете производительность как единственное узкое место, то ActiveRecord отстает.Я бы сказал, сделать небольшое исследование.Приведенный выше запрос является соединительным запросом, и, безусловно, необработанный SQL даст вам заметное преимущество в производительности.Можно сделать много других вещей, чтобы значительно повысить производительность запросов, например, правильные indexing, caching, eager loading (когда возникает необходимость, а иногда быстрая загрузка фактически замедляет запросы) и т. Д. Перед тем, как отказаться от ActiveRecordубедитесь, что это действительно узкое место.

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