这些显然不是我的实际模型,但它们就是一个例子。我有以下类定义。
class Movie < ActiveRecord::Base
has_one :opening
has_one :opening_info, through: :opening
end
class Opening < ActiveRecord::Base
belongs_to :movie
has_one :opening_info
end
class OpeningInfo < ActiveRecord::Base
belongs_to :opening
# OpeningInfo has a opening_date attribute in the DB
end
我想找到所有电影都有一个不存在的开场,一个现有的开场但不存在的OpeningInfo,或者现有的开场和现有的OpeningInfo但是一个nil的开场日期。我可以这样做
ids = Movie.joins(:opening_info).where.not(opening_infos: { opening_date: nil })
Movie.where("id not in (?)", ids)
但是这个查询很慢,大约2/3秒,理想情况下我希望它不会超过其他普通查询,大约100-500毫秒。这样做的轨道方式是什么?
答案 0 :(得分:0)
您是否已将索引添加到您要查询的列中?这应该可以加快速度。
答案 1 :(得分:0)
找出答案
Movie.includes(:opening, :opening_info).where("opening_infos.opening_date is null or opening_infos is null or openings is null")