繁体   English   中英

如何在Rake文件中遍历我所有的Ruby on Rails用户?

[英]How To Iterate Through All My Ruby on Rails Users In A Rake File?

我正在尝试编写一个rake任务,该任务遍历Ruby on Rails项目中的所有用户,然后对其进行更改。 我知道足够的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模型代码,我想它的关联如下:

belongs_to: user

这就是为什么它会给出错误User must exist 检查链接以进行Github讨论。 它是在Rails 5中添加的,所以我想,那也是您的Rails版本。

像这样添加关联belongs_to :user, optional: true ,使此功能像在Rails 5之前一样。

对于错误“ User can't be blank ,我认为这是因为您已向Post模型添加了另一个额外的验证,如下所示:

validates :user, :presence => true

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

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

附带说明:根据数据库大小(记录的用户数),应避免使用User.all因为它会将所有用户加载到内存中,并且在生产中,它可能会消耗过多的内存。 find_in_batches是一个很好的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM