ruby-on-rails - 在方法中收集初始化的 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!
解决方案
如果您可以修改源,最简单的方法是从您的方法中返回一个数组。
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
推荐阅读
- c++ - 告诉我一种在 C++ 中对 char 向量进行排序的方法
- numpy - 计算 get_weights() 输出中非零元素数量的最快方法
- python - 分隔符未知时如何检测空值?
- arrays - 使用少于排列长度的字节保存排列
- python - 如何从 Python 程序内部调用 linux mailx 命令并使用存储在变量中的值?
- javascript - 使用 JQuery 从弹出窗口访问数据(集)
- powerbi - 在 Powerbi 中分组/汇总之前过滤
- python - 当我按左右键时,如何让我的播放器(船)旋转?
- swift - 如何将int数组快速转换为逗号分隔
- vim - Vim 专门让我进入插入模式