Rails重新排序不起作用?

时间:2015-04-22 14:03:40

标签: ruby-on-rails ruby-on-rails-4 activerecord

我有一个反馈模型,其他两个模型(评论和评论)继承自。

我在反馈模型中有一个默认范围,按ID asc

排序

我已在反馈模型中添加了一个范围:

class Feedback < ActiveRecord::Base
  include Paginatable

  belongs_to :video

  default_scope do
    order(:id => :asc)
  end

  scope :newest, -> { reorder(:created_at => :desc) }

end

我有一个视频模型,其中包含:

has_many :feedback 
has_many :latest_feedback, -> { newest }, class_name: 'Feedback'

我遇到的问题是,当我打电话时

Video.includes(:latest_feedback).find(1)

它仍然首先按id命令反馈,然后按created_at命令反馈,这不是我想要的。我希望仅latest_feedback

订购created_at

以下是它的作用:

Video Load (0.3ms)  SELECT  `videos`.* FROM `videos`  WHERE `videos`.`id` = 85  ORDER BY `videos`.`id` DESC LIMIT 1
Feedback Load (0.6ms)  SELECT `feedback`.* FROM `feedback`  WHERE `feedback`.`video_id` IN (1)  ORDER BY `feedback`.`id` ASC, `feedback`.`created_at` DESC

这就是我需要做的事情:

Video Load (0.3ms)  SELECT  `videos`.* FROM `videos`  WHERE `videos`.`id` = 85  ORDER BY `videos`.`id` DESC LIMIT 1
Feedback Load (0.6ms)  SELECT `feedback`.* FROM `feedback`  WHERE `feedback`.`video_id` IN (1)  ORDER BY `feedback`.`created_at` DESC

更新

我想这是rails的一个已知问题。还有一个公开拉取请求来修复它:

https://github.com/rails/rails/pull/16531

看起来这不会落到Rails 5.0.0之前。

2 个答案:

答案 0 :(得分:0)

您可以使用Video.joins(:latest_feedback).find(1)。似乎Rails在includes

上没有范围重新计算时附加默认范围

答案 1 :(得分:0)

试试这个Video.includes(:latest_feedback).order('feedbacks.id desc').find(1)