首页 > 解决方案 > 在方法中收集初始化的 ActiveModel 实例?

问题描述

如何在方法执行期间获取所有实例化的 ActiveModel 实例?

class Foo
  def some_method
    Post.new title: 'First title'
    Post.new title: 'Second title'
  end
end

module Launcher
  def self.launch!
    fooser = Foo.new
    new_posts = Post.watch do
      fooser.some_method()
    end

    # new_posts => #<Enumerator [#2 initialized Posts#]>
    # Some logic for saving all these initialized objects at once
  end
end

Launcher.launch!

标签: ruby-on-railsruby

解决方案


如果您可以修改源,最简单的方法是从您的方法中返回一个数组。

def some_method
  [
    Post.new title: 'First title',
    Post.new title: 'Second title',
  ]
end

但是,我假设您的解决方案并不那么简单,您实际上想要收集在块执行期间启动的所有模型。

最简单的方法是使用after_initialize它并将记录存储到例如类变量中。

def self.watch
  @records = []
  @watching = true
  yield
ensure
  @watching = false
  @records
end

def self.record_initialized(record)
  @records << record if @watching
end

after_initialize { |record| record.class.record_initialized(record) }

如果您在某个时候想使用一个查询插入它们,请查看.insert_all


推荐阅读