Ruby on rails 如何在一个Rake文件中遍历所有rubyonrails用户?
我正试图编写一个rake任务,在rubyonrails项目中迭代我的所有用户,然后对他们进行更改。我知道足够多的Ruby来为一个用户完成这项工作,并且我已经成功地完成了这项工作,现在我想迭代所有用户并执行同样的操作 这是我当前的代码: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
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行不起作用,因为我以前让它为单个用户工作,它只是在所有用户中迭代,似乎会导致问题。谢谢,只使用您建议的最终代码就可以了,我不需要更改任何验证:)