Rails 3.2:订购一个has_many:通过选择,当直通模型有一个default_scope时

时间:2012-11-08 12:20:08

标签: sql ruby-on-rails ruby-on-rails-3

我有一个简单的时间跟踪应用程序,它有项目,任务和条目。

设置很简单:

class Project < ActiveRecord::base
  has_many :tasks
  has_many :entries, :through => :tasks
end

class Task < ActiveRecord::base
  belongs_to :project
  has_many :entries

  default_scope order("name asc") # this causes problems
end

Entry完全是直接的,所以我把它留了出来)

但是,当我尝试对从项目中选择的条目进行自定义排序时,我遇到了麻烦。具体来说,我正在尝试选择最新的条目:

latest_entry = project.entries.order("created_at desc").first

但由于:through => :tasksdefault_scope具有Task,因此Rails执行的实际查询变为:

SELECT `entries`.* FROM `entries`
INNER JOIN `tasks` ON `entries`.`task_id` = `tasks`.`id`
WHERE `tasks`.`project_id` = 23
ORDER BY name asc, entries.date desc LIMIT 1 -- wrong order!

请注意ORDER BY clause - 它包含default_scope中的Task,之后才会包含我指定的订单。

所以基本上,我获取项目中所有条目的最新条目,但只获得第一个任务中的最新条目。

有什么方法吗?似乎应该有一种方法可以忽略/否定default_scope模型through(不完全删除default_scope

1 个答案:

答案 0 :(得分:1)

reorder

怎么样?
latest_entry = project.entries.reorder("created_at desc").first