【问题标题】:How to update all records that were created yesterday with Rails?如何更新昨天用 Rails 创建的所有记录?
【发布时间】:2015-02-09 14:07:58
【问题描述】:

我需要更新昨天创建的所有记录的信息,为此我使用以下代码创建了migration

class UpdateFbidToVotes < ActiveRecord::Migration
  def up
    Vote.all.each do |v|
      if v.created_at == Date.today-1
        v.fbid = v.fbid + 1
        v.update!
      end
    end
  end
end

但是,这不起作用。你能指出我做错了什么吗?

谢谢!

【问题讨论】:

  • 我认为您不需要为此迁移,Vote.all 正在获取所有记录,并且您的 if 条件会过滤它们,这可能通过查询发生。

标签: ruby-on-rails ruby database-migration


【解决方案1】:

类似这样的:

Vote.where(created_at: Date.yesterday).update_all('fbid = fbid + 1')

【讨论】:

  • 标识符引用规则取决于数据库。标准 SQL 和 PostgreSQL 使用双引号,MySQL 使用反引号,SQL Server 使用方括号,……最好不要引用它们。
【解决方案2】:

试试:

yesterday = 1.day.ago # or Time.now.yesterday
Vote.where(created_at: yesterday.beginning_of_day..yesterday.end_of_day).update_all('fbid = fbid + 1')

此外,迁移文件用于管理表架构,我鼓励您将此类数据库更新/删除查询移动到 rake 任务而不是迁移文件,此类查询是不可逆的(即您不能依赖获取更改回以前的状态)并且不应成为迁移的一部分。

【讨论】:

  • 感谢您提供有关使用 rake 任务的提示。这样做了,您的解决方案运行良好! :)
猜你喜欢
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多