Rails 3.2 Query - .exists? - PullRequest
       12

Rails 3.2 Query - .exists?

2 голосов
/ 29 марта 2012

У меня около 500 торговых точек.Каждое отделение будет контролироваться как минимум один раз в день.Я пытаюсь получить список торговых точек, которые отслеживались каждый день.

У меня сейчас проблема с запросом, любая помощь приветствуется:

<% for outlet in @outlets %>
    <% if Monitoring.exists?( :outlet_id => outlet.id, 'DATE(created_at) = ?', Date.today ) %>

The @outlets - это переменная экземпляра, содержащая Outlet.all.

Этот запрос оставляет меня с синтаксической ошибкой.Каков будет правильный способ сделать это?Я пытаюсь проверить, что Мониторинг принадлежит Розетке, и что запись Мониторинга была создана сегодня.

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

Любая помощь очень ценится.

1 Ответ

2 голосов
/ 29 марта 2012

Вы получаете синтаксическую ошибку, потому что пытаетесь смешать аргументы implicit-Hash и implicit-Array:

Monitoring.exists?(:outlet_id => outlet.id, 'DATE(created_at) = ?', Date.today)

Методы exists? хотят использовать Hash в качестве единственного аргумента. Вы хотите использовать функцию SQL в запросе, но это означает, что вы должны использовать форму Model.where(...).exists?:

Monitoring.where(:outlet_id => outlet.id).where('date(created_at) = ?', Date.today).exists?

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

counts = Monitoring.where('date(created_at) = ?', Date.today).count(:group => :outlet_id)

А затем посмотрите, используйте counts.has_key? outlet.id в вашем цикле. Добавление where(:outlet_id => outlet_ids) (где outlet_ids - идентификаторы, которые вас интересуют) также может иметь смысл. Возможно, вы сможете объединить запрос count с запросом, который также генерирует @outlets.

...