【问题标题】:Increment array index after rake taskrake 任务后增加数组索引
【发布时间】:2016-03-30 20:09:22
【问题描述】:

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

试一试

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 任务时发生。你最终想要做什么?最终目标是什么?记录所有推文?
  • 是的,定期记录推文……全部。

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


【解决方案1】:

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

【讨论】:

  • 没有。每个用户将设置发布帖子的周期。每个用户的发帖频率会有所不同。用户选择发布帖子的频率。它不是固定的。
  • 在那种情况下……为了保持对环境的访问,worker 比 rake 任务更好。
【解决方案2】:

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

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

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

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

应该就是这样。

【讨论】:

    猜你喜欢
    • 2013-12-11
    • 1970-01-01
    • 2010-12-25
    • 2013-05-12
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多