我有一个反馈模型,其他两个模型(评论和评论)继承自。
我在反馈模型中有一个默认范围,按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之前。
答案 0 :(得分:0)
您可以使用Video.joins(:latest_feedback).find(1)
。似乎Rails在includes
答案 1 :(得分:0)
试试这个Video.includes(:latest_feedback).order('feedbacks.id desc').find(1)