rake任务后增加数组索引

时间:2016-03-30 11:40:04

标签: ruby-on-rails redis rake rake-task

所以我有一个字符串数组,我想发送给我的Rails记录器。我想要的是每次rake任务运行后,我的索引加1,以便下一个字符串是记录器中的帖子。我尝试过使用类变量和使用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任务运行后迭代数组吗?

2 个答案:

答案 0 :(得分:2)

为什么不在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

答案 1 :(得分:1)

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

然后,您可以在任务中使用incr方法,就像您已经做的那样。根据{{​​3}},如果密钥不存在,incr会在递增之前将密钥下的值设置为0。

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

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

那应该是它。