在 Rails 5 中更新模型的特定属性
Updating specific attributes on models in Rails 5
我是 rails 5 的新手,需要一些语法方面的帮助..
我有两个模型 Saving
和 Investment
.. 每个储蓄可以有很多投资,所以关系是 1:m。两个模型都有一个布尔属性 is_autobid
。
我想创建一个 rake 任务来检索 is_autobid = true
中的所有储蓄,然后将特定储蓄记录的第一笔投资更新为 true ..到目前为止我有:
task :update_autobids => :environment do
Saving.where(is_autobid: 1).all.each do |s|
investment = s.investments.first(:is_autobid, 0)
investment.update(is_autobid = 1)
end
end
您可以使用 update_column 更新单个列,它不会检查任何验证,并且 您只需要在找到任何记录时更新投资
Saving.where(is_autobid: 1).each do |s|
investment = s.investments.find_by(is_autobid: 0)
investment.update_column(:is_autobid, 1) if investment
end
Update
如果你想一次加载所有记录,你可以使用下面的查询
investments = Investment.includes(:saving).where("savings.id = (select id from savings where savings.is_autobid = 0 limit 1)").references(:saving)
investments.each do |investment|
investment.update_column(:is_autobid, 1)
end
我是 rails 5 的新手,需要一些语法方面的帮助..
我有两个模型 Saving
和 Investment
.. 每个储蓄可以有很多投资,所以关系是 1:m。两个模型都有一个布尔属性 is_autobid
。
我想创建一个 rake 任务来检索 is_autobid = true
中的所有储蓄,然后将特定储蓄记录的第一笔投资更新为 true ..到目前为止我有:
task :update_autobids => :environment do
Saving.where(is_autobid: 1).all.each do |s|
investment = s.investments.first(:is_autobid, 0)
investment.update(is_autobid = 1)
end
end
您可以使用 update_column 更新单个列,它不会检查任何验证,并且 您只需要在找到任何记录时更新投资
Saving.where(is_autobid: 1).each do |s|
investment = s.investments.find_by(is_autobid: 0)
investment.update_column(:is_autobid, 1) if investment
end
Update
如果你想一次加载所有记录,你可以使用下面的查询
investments = Investment.includes(:saving).where("savings.id = (select id from savings where savings.is_autobid = 0 limit 1)").references(:saving)
investments.each do |investment|
investment.update_column(:is_autobid, 1)
end