如何在 for 循环中更新模型属性的值
How to update value of a Model's attribute in a for loop
我有以下有效的代码
twt = Tweet.where(user_id: @user.uid).where(status_id: 0).order(:created_at, :id).first
twt.status_id = 1
twt.save
我想为数据库中的每个可用用户制作此代码运行:
@user = User.all
@user.each do |u|
twt = Tweet.where(user_id: u.uid).where(status_id: 0).order(:created_at, :id).first
twt.status_id = 1
twt.save
end
然而,这给了我错误:
undefined method `status_id=' for nil:NilClass
为什么找不到 class?为什么在 twt 中设置不正确?
简单来说,对于某些用户来说,这一行
twt = Tweet.where(user_id: u.uid).where(status_id: 0).order(:created_at, :id).first
没有找到结果。您可以添加
if twt
twt.status_id = 1
twt.save
end
无论如何,您可以将其重写为
Tweet.find_by(user_id: u.uid, status_id: 0).order(:created_at, :id)
显然,只需一个 SQL 查询即可完成所有这些工作。
我有以下有效的代码
twt = Tweet.where(user_id: @user.uid).where(status_id: 0).order(:created_at, :id).first
twt.status_id = 1
twt.save
我想为数据库中的每个可用用户制作此代码运行:
@user = User.all
@user.each do |u|
twt = Tweet.where(user_id: u.uid).where(status_id: 0).order(:created_at, :id).first
twt.status_id = 1
twt.save
end
然而,这给了我错误:
undefined method `status_id=' for nil:NilClass
为什么找不到 class?为什么在 twt 中设置不正确?
简单来说,对于某些用户来说,这一行
twt = Tweet.where(user_id: u.uid).where(status_id: 0).order(:created_at, :id).first
没有找到结果。您可以添加
if twt
twt.status_id = 1
twt.save
end
无论如何,您可以将其重写为
Tweet.find_by(user_id: u.uid, status_id: 0).order(:created_at, :id)
显然,只需一个 SQL 查询即可完成所有这些工作。