我有一个简单的时间跟踪应用程序,其中包含项目、任务和条目。
设置很简单:
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 => :tasks
和 default_scope
具有的 Task
和 ORDER BY clause
,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!
请注意
default_scope
- 它包含来自 Task
的 default_scope
,只有在此之后它才包含我指定的顺序。所以基本上,我没有得到项目中所有条目的最新条目,而只是第一个任务中的最新条目。
有什么办法吗?似乎应该有一种方法可以忽略/否定
through
模型上的 default_scope
(无需完全删除 ojit_code ) 最佳答案
reorder 怎么样:
latest_entry = project.entries.reorder("created_at desc").first
关于sql - Rails 3.2 : Ordering a has_many :through selection, 当直通模型具有 default_scope 时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13289019/