Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.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 如何在Rails中循环服务对象_Ruby On Rails - Fatal编程技术网

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
进行批处理。