Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 预加载与lambda失败条件的关联_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 预加载与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需要一个查询来加载所有事件,但当每个父对象的条件发生变化时,它不知道如何加载(如果我的内存正确,当您包含关联时也是如此)我喜欢一篇

我在尝试预加载包含条件lambda的多个关联时遇到了命名错误

这是我的模型 预加载程序似乎只在没有条件lambda的关系上工作


有人有什么想法吗?这是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