Рефакторинг метода activerecord в Rails 3 - PullRequest
0 голосов
/ 16 июля 2011

Можно ли перестроить и упростить этот метод событий?

class Manager < User
  has_and_belongs_to_many :customers

  def events
    Event.joins(:customers => :managers).where(:users => { :id => self }).select("DISTINCT(events.id), events.description, events.created_at")
  end

end

Я надеялся, что смогу построить запрос поверх имеющегося у меня экземпляра Manager, но, похоже, не смог этого сделать.Я попробовал следующее, но получил ошибку

def events
  customers.joins(:events).select("DISTINCT(events.id), events.description, events.created_at")
end

и

current_user.events

Но это приводит к ошибке MySQL:

Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DISTINCT(events.id), events.description, events.created_at FROM `customers` INNER' at line 1: SELECT `customers`.*, DISTINCT(events.id), events.description, events.created_at FROM `customers` INNER JOIN `customers_events` ON `customers_events`.`customer_id` = `customers`.`id` INNER JOIN `events` ON `events`.`id` = `customers_events`.`event_id` INNER JOIN `customers_managers` ON `customers`.`id` = `customers_managers`.`customer_id` WHERE `customers_managers`.`manager_id` = 27 ORDER BY created_at DESC

1 Ответ

0 голосов
/ 16 июля 2011

Согласно руководству MySQL , ключевое слово DISTINCT должно стоять перед select_expr:

SELECT foo.*, DISTINCT(foo.id) 

выдаст вам эту ошибку.

SELECT distinct(foo.id), foo.*

будет работать. Попробуйте это:

customers.select("DISTINCT(events.id), events.description, events.created_at").joins(:events)

Однако, если все, что вы пытаетесь сделать, - это получать уникальные события для каждого пользователя (я полагаю, для этого и используется DISTINCT), вы можете просто использовать

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