Ruby on rails 预加载与lambda失败条件的关联
我在尝试预加载包含条件lambda的多个关联时遇到了命名错误 这是我的模型 预加载程序似乎只在没有条件lambda的关系上工作Ruby on rails 预加载与lambda失败条件的关联,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我在尝试预加载包含条件lambda的多个关联时遇到了命名错误 这是我的模型 预加载程序似乎只在没有条件lambda的关系上工作 有人有什么想法吗?这是ActiveRecord::Associations::Preload类中的错误吗 如果要预加载关联,则可以使用条件,但不会向您传递父记录(在本例中为_day),因为每个day对象的父记录都不同 Activerecord需要一个查询来加载所有事件,但当每个父对象的条件发生变化时,它不知道如何加载(如果我的内存正确,当您包含关联时也是如此)我喜欢一篇
有人有什么想法吗?这是ActiveRecord::Associations::Preload类中的错误吗 如果要预加载关联,则可以使用条件,但不会向您传递父记录(在本例中为_day),因为每个day对象的父记录都不同
Activerecord需要一个查询来加载所有事件,但当每个父对象的条件发生变化时,它不知道如何加载(如果我的内存正确,当您包含关联时也是如此)我喜欢一篇介绍如何手动预加载的好文章 这是我的预加载代码。 结果
嗯,好吧,我想这是一个复合主键的用例。我已经手动设置了预加载。我认为复合主键有一个gem,你每个日历日都要进行一次查询-为什么还要急于加载呢?这并不理想,为事件创建activerecord关系并使用它进行查询将请求时间缩短了20%。我将把
事件
更改为一个数组,然后使用find\u all。
Class Event < ActiveRecord::Base
belongs_to :user
end
Class CalendarDay < ActiveRecord::Base
belongs_to :user
has_many :events,
->(_day) {
where(
user_id: _day.user_id,
deleted_at: nil
)
},
autosave: false,
foreign_key: :date,
primary_key: :date,
end
days = CalendarDay.all.to_a
loader = ActiveRecord::Associations::Preloader.new
loader.preload(days, :events)
#NoMethodError: undefined method `user_id' for nil:NilClass
collection = CalendarDay.all
dates = collection.map(&:date)
user_ids = collection.map(&:user_id)
events = Event.where(
date: dates,
user_id: user_ids
).to_a
collection.each do |record|
association = record.association(:events)
association.loaded!
association.target.concat(
#events.where(
# user_id: record.user_id,
# date: record.date,
# deleted_at: nil
#)
events.find_all { |e|
e.user_id == record.user_id &&
e.date == record.date &&
e.deleted_at == nil
}
)
end
#No preload code.
Views: 1129.8ms | ActiveRecord: 409.8ms
#Cache active record relation then query for each day.
Views: 296.4ms | ActiveRecord: 198.6ms
#Run query and use find_by
Views: 290.2ms | ActiveRecord: 28.2ms