Ruby on rails 如何在一个Rake文件中遍历所有rubyonrails用户?

Ruby on rails 如何在一个Rake文件中遍历所有rubyonrails用户?,ruby-on-rails,Ruby On Rails,我正试图编写一个rake任务,在rubyonrails项目中迭代我的所有用户,然后对他们进行更改。我知道足够多的Ruby来为一个用户完成这项工作,并且我已经成功地完成了这项工作,现在我想迭代所有用户并执行同样的操作 这是我当前的代码: namespace :abc do desc "Used to generate a new daily log" STARTING_DATE = Date.new(2017, 04, 03) task :create_post => :environ

我正试图编写一个rake任务,在rubyonrails项目中迭代我的所有用户,然后对他们进行更改。我知道足够多的Ruby来为一个用户完成这项工作,并且我已经成功地完成了这项工作,现在我想迭代所有用户并执行同样的操作

这是我当前的代码:

namespace :abc do 
desc "Used to generate a new daily log"

STARTING_DATE = Date.new(2017, 04, 03)

task :create_post => :environment do

User.all.each do |currentUser|
     Post.create!(content: "RAKED") if Date.today >= STARTING_DATE
end
puts "It worked yo"     
end

end
问题在于对用户的迭代。当前写入的错误是:“ActiveRecord::RecordInvalid:验证失败:用户必须存在,用户不能为空”

有人知道这样迭代用户的Ruby方法吗

此外,我还尝试了以下代码:

User.all.each do |currentUser|
 puts currentUser.name
end
它将正确显示每个用户的名称。因此,这可能与我的用户与Post.create交互有关!线路


谢谢

我相信这是因为您没有初始化
@users
以引用您的所有用户


尝试在for each循环之前添加
@users=User.all

如果没有
Post
model的代码,我猜它有一个类似于:

属于:用户

这就是为什么它给出错误
用户必须存在
。检查Github讨论的链接。它是在Rails 5中添加的,所以我想,这也是您的Rails版本

添加如下关联:user,optional:true
,使此函数与Rails 5之前的函数类似

对于错误
用户不能为空
,我认为这是因为您在
Post
模型中添加了另一个额外的验证,如下所示:

User.all.each do |currentUser|
     Post.create!(content: "RAKED", user: currentUser) if Date.today >= STARTING_DATE
end
验证:用户,:状态=>true

因此,如果不是每个Post记录都必须使用用户外键,那么您必须删除此验证,并按照上面的建议使用
optional:true
。否则,如果您保留此验证或不打算使用
可选
标志,则必须为您创建的每个帖子提供
用户
。也许您可以尝试修改代码,如下所示:

User.all.each do |currentUser|
     Post.create!(content: "RAKED", user: currentUser) if Date.today >= STARTING_DATE
end

另请注意:根据您的数据库大小(记录的用户数),您应该避免使用
User.all
,因为它会将所有用户加载到内存和生产中,可能会消耗太多内存。可以是一个很好的选择。

User.all.each而不是@users.eachI也尝试了这个,它给出了错误:“ActiveRecord::RecordInvalid:验证失败:用户必须存在,用户不能为空”甚至做User.all.each我都会得到错误:“ActiveRecord::RecordInvalid:验证失败:用户必须存在,用户不能为空”嗯。。尝试向Post添加关联,如
属于:user,可选:true
。我已经拥有属于,但不是可选部分。添加可选部分会删除“用户必须存在”错误,但如果您只是尝试将currentUser.User\u id替换为Post.create,我仍然会收到错误:“ActiveRecord::RecordInvalid:验证失败:用户不能为空”。这行吗?嗨,谢谢!我试过这个,它确实有效。但是,我不确定为什么我的Post.create行不起作用,因为我以前让它为单个用户工作,它只是在所有用户中迭代,似乎会导致问题。谢谢,只使用您建议的最终代码就可以了,我不需要更改任何验证:)