rake 任务后增加数组索引

Increment array index after rake task

所以我有一组字符串要发送到我的 Rails 记录器。我想要的是在每个 rake 任务 运行 之后,我的索引增加一个,以便下一个字符串是记录器中的帖子。我已经尝试过使用 class 变量和使用 Redis 的传统方法。我的索引拒绝增加。这是我试过的。

尝试 1

accounts_controller.rb

class AccountsController < ApplicationController
  cattr_accessor :index
  @@index ||= 0

  def self.post
    current_user = User.find_by(:id => 1)
    user_posts = current_user.accounts.find_by(:id => 1).posts
    Rails.logger.info user_posts[@@index].tweet
  end
end

post.rake

desc 'send post to twitter'
task send_posts: :environment do
  AccountsController.post
  AccountsController.index += 1
end

在第二次尝试中,我尝试使用 Redis 使我的 @@index 变量持久化。还是没有增量。

accounts_controller.rb

class AccountsController < ApplicationController
  cattr_accessor :index
  @@index = $redis.set('index', 0)

  def self.post
    current_user = User.find_by(:id => 1)
    user_posts = current_user.accounts.find_by(:id => 1).posts
    Rails.logger.info user_posts[@@index.to_i].tweet
  end
end

post.rake

desc 'send post to twitter'
task send_posts: :environment do
  AccountsController.post
  #AccountsController.index += 1
  $redis.incr('index')
end

谁能帮我在每个 rake 任务后遍历数组 运行?

为什么不在 rake 任务中循环执行所有这些操作呢?为什么要增加那个变量呢?你可以把它全部放在你的 rake 任务中。

User.find_each do |user|
  user_posts = []
  user.accounts.each { |account| user_posts << account.posts }
  user_posts.each { |post| Rails.logger.info post.tweet }
end

您必须将增量值 存储在 rails 代码之外 因为 Rails 每次 rake 任务 运行s 时都会真正加载(状态绝不会保留在耙子 运行s 之间)。因此,使用 Redis 方法。

然后,您可以在您的任务中使用 incr 方法,就像您已经在做的那样。根据the documentation,如果key不存在,incr会把key下的值设置为0再递增。

最后,不要在您的控制器中将该值设置为 0,否则您实际上会在每个 运行 rake 任务期间重置该值。相反,仅使用 get 从 Redis 获取当前值:

class AccountsController < ApplicationController
  cattr_accessor :index
  @@index = $redis.get('index') || 0
end

应该就是这样了。