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
应该就是这样了。
所以我有一组字符串要发送到我的 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
应该就是这样了。