【问题标题】:Rails 3.2: Ordering a has_many :through selection, when the through-model has a default_scopeRails 3.2:订购 has_many :通过选择,当通过模型具有 default_scope 时
【发布时间】:2012-11-08 12:20:08
【问题描述】:

我有一个简单的时间跟踪应用程序,其中包含项目、任务和条目。

设置很简单:

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

但是由于Task 具有:through =&gt; :tasksdefault_scope,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 - 它包括来自Taskdefault_scope,只有在那之后它才包括我指定的顺序。

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

有没有办法解决这个问题?似乎应该有一种方法可以在through-model 上忽略/否定default_scope(而不完全删除default_scope

【问题讨论】:

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


    【解决方案1】:

    reorder怎么样:

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

    【讨论】:

    • 好的,所以我是个白痴——老实说,我不知道我错过了那个方法。一直在看文档,但显然......好吧,我是个白痴。 Nuff' 说 :) -- 谢谢!
    • 遇到了同样的问题。当您访问project.entries 时,有没有办法默认应用此reorder。设置 :has_many :entries, :through =&gt; :tasks, :order =&gt; '...' 在默认范围顺序之后应用此顺序。
    猜你喜欢
    • 1970-01-01
    • 2012-06-27
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2015-10-27
    相关资源
    最近更新 更多