所以我有一个字符串数组,我想发送给我的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任务运行后迭代数组吗?
答案 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
那应该是它。