鉴于以下两个类:
class Location < ActiveRecord::Base
belongs_to :holiday_schedule
validates :name, :presence => true, :uniqueness => {:case_sensitive => false}
scope :with_holiday_schedule, includes(:holiday_schedule)
end
class HolidaySchedule < ActiveRecord::Base
validates_presence_of :name
has_many :locations
end
如何规范with_holiday_schedule范围以确保在循环中访问location.holiday_schedule.name不会导致N + 1查询问题?
答案 0 :(得分:4)
在向RSpec用户发送邮件列表并阅读更多有关一般情况下的搜索后,我最终意识到这不值得进行单元测试。 :includes指令在rails中经过了充分测试,测试该简单行的开销高于与其失败或被其他开发人员删除相关的风险 - 至少在我的情况下。
我真正关心的是应用程序的性能。指定性能比通过箍来对这条线进行单元测试要高效得多。
答案 1 :(得分:3)
查看Counting the number of queries performed。
这应该在您的解决方案中完美运行。 他们做到了这一点:
ActiveRecord::Base.count_queries do
Ticket.first
end
您可以在规范中使用这种方式:
queries = ActiveRecord::Base.count_queries do
location.with_holiday_schedule.holiday_schedule.name
end
queries.should_be == 1
我希望这会奏效。