在rails

时间:2015-10-02 13:08:53

标签: ruby-on-rails activerecord

这些显然不是我的实际模型,但它们就是一个例子。我有以下类定义。

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毫秒。这样做的轨道方式是什么?

2 个答案:

答案 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")