Ruby on rails 在Rails 3中重构activerecord方法

Ruby on rails 在Rails 3中重构activerecord方法,ruby-on-rails,ruby-on-rails-3,activerecord,refactoring,find,Ruby On Rails,Ruby On Rails 3,Activerecord,Refactoring,Find,这个事件方法能被重新分解和简化吗 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

这个事件方法能被重新分解和简化吗

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

但这会导致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
根据,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")

你至少可以说出错误是什么,以及你试图实现什么。谢谢你的回复,很不幸,我在你的第一个解决方案中得到了完全相同的错误。你的第二个解决方案会导致一个错误,因为用户只有通过客户的事件。嗯,我没有你的DB或模型结构,所以我不能提供一个精确的解决方案。要点是,如果可以避免的话,不要使用DISTINCT-使用组。如果必须使用DISTINCT,则必须找到一种方法将活动记录作用域链接到DISTINCT是select语句的第一部分。我一直在试验生成的SQL,问题似乎出在SQL select customers上。*因为未包含customers表。在您包含的错误消息中,该查询包括对客户的联接。尝试将完整查询复制到您的控制台-您应该看到,如果您颠倒顺序并将不同的部分放在前面,它应该可以工作。似乎.select被忽略了,我认为这是Rails 3.1的一个错误
customers.select("DISTINCT(events.id), events.description, events.created_at").joins(:events)
current_user.events.group("events.id")