Ruby on rails 如何在Rails中循环服务对象
我把代码做得非常简单 假设当我调用Ruby on rails 如何在Rails中循环服务对象,ruby-on-rails,Ruby On Rails,我把代码做得非常简单 假设当我调用Class.new(object.call)时,它将返回一个响应 目标很简单 我想循环一个服务,例如 /服务/更新\u许多\u post.rb /服务/更新_a_post.rb 我想调用rake任务 UpdateManyPost.new.call do |response| # but seems like when i do, Nothing is return from the call. Rails.logger.info(response)
Class.new(object.call)时,它将返回一个响应
目标很简单
我想循环一个服务,例如
/服务/更新\u许多\u post.rb
/服务/更新_a_post.rb
我想调用rake任务
UpdateManyPost.new.call do |response|
# but seems like when i do, Nothing is return from the call.
Rails.logger.info(response)
end
在你的rake任务中,试试这个
response = UpdateManyPost.new.call
Rails.logger.info(response)
您可以使用ActiveRecord提供的update\u all
方法,而不是迭代帖子并更新每个帖子
class UpdateManyPost
def call
posts.update_all(title: "I am great")
end
private
def posts
Post.all
end
end
在你的rake任务中,试试这个
response = UpdateManyPost.new.call
Rails.logger.info(response)
您可以使用ActiveRecord提供的update\u all
方法,而不是迭代帖子并更新每个帖子
class UpdateManyPost
def call
posts.update_all(title: "I am great")
end
private
def posts
Post.all
end
end
当前rake任务代码似乎没有返回任何内容的原因是UpdateManyPost.new.call
方法没有占用块。正在调用它,但您的响应块
根本没有被使用
为了让rake任务代码按您的方式工作,您需要UpdateManyPost\call
获取一个块参数,并在posts
中迭代每个post
,生成运行updatepost\call
的响应:
# service/update_many_post.rb
class UpdateManyPost
def call(&block)
posts.each do |post|
response = UpdateAPost.new(post: post).call
yield response
end
end
...
end
更好的方法是使用posts.find_each
,这是ActiveRecord提供给您的一个批处理实用程序,它使用LIMIT和OFFSET自动分页查询,一次只将1000个结果加载到内存中。它基本上可以与帖子互换;它将迭代所有结果,它只是自动为您处理批处理。当前rake任务代码似乎没有返回任何内容的原因是您的UpdateManyPost.new.call方法没有占用任何块。正在调用它,但您的响应块
根本没有被使用
为了让rake任务代码按您的方式工作,您需要UpdateManyPost\call
获取一个块参数,并在posts
中迭代每个post
,生成运行updatepost\call
的响应:
# service/update_many_post.rb
class UpdateManyPost
def call(&block)
posts.each do |post|
response = UpdateAPost.new(post: post).call
yield response
end
end
...
end
更好的方法是使用posts.find_each
,这是ActiveRecord提供给您的一个批处理实用程序,它使用LIMIT和OFFSET自动分页查询,一次只将1000个结果加载到内存中。它基本上可以与帖子互换;它将迭代所有结果,只会自动为您处理批处理。数据确实发生了变化。目标是为每个调用updatePost
返回响应。更新了我的答案。我想您可以从UpdateManyPost.new.call
中获得一个布尔值数组,数据确实发生了变化。目标是为每个调用updatePost
返回响应。更新了我的答案。我想您可以从UpdateManyPost.new.call
中获得一个布尔值数组,生成每个响应在我看来是一个更好的选择。这使得响应是一次性的,而不是返回一个可能消耗大量内存的整个数组。您是对的,@engineersmnky。谢谢你再次打来电话,我一直在这附近见到你:)。我的目标是简单地解决试图将块直接传递给调用的问题。UpdateManyPost
一次拉入所有记录的事实更是一个潜在的内存问题,因为AcitveRecord对象很大。如果我担心内存问题,我会使用find_each
对其进行批处理,首先是Yeah I Wang;虽然你会在评论部分找到更多我的答案,因为除非我不同意所有的答案,否则我觉得添加答案并稍加修改只会把文章弄得一团糟。(声誉点数或其他名称对我来说并不重要)@rmhunter如何批处理?@airsoftfrack我完全更新了我的答案。我相信现在它实际上回答了您所寻找的实现,并且受到@engineersmnky的启发,即屈服是正确处理内存的最佳方式。我还在末尾添加了一条关于如何使用find_each
进行批处理的注释。在我看来,生成每个响应是一个更好的选择。这使得响应可以一次性使用,而不是返回一个可能消耗大量内存的整个数组@engineersmnky说得对。谢谢你再次打来电话,我一直在这附近见到你:)。我的目标是简单地解决试图将块直接传递给调用的问题。UpdateManyPost
一次拉入所有记录的事实更是一个潜在的内存问题,因为AcitveRecord对象很大。如果我担心内存问题,我会使用find_each
对其进行批处理,首先是Yeah I Wang;虽然你会在评论部分找到更多我的答案,因为除非我不同意所有的答案,否则我觉得添加答案并稍加修改只会把文章弄得一团糟。(声誉点数或其他名称对我来说并不重要)@rmhunter如何批处理?@airsoftfrack我完全更新了我的答案。我相信现在它实际上回答了您所寻找的实现,并且受到@engineersmnky的启发,即屈服是正确处理内存的最佳方式。我还在末尾添加了一条注释,说明如何使用find_each
进行批处理。