Rails Postgres:将 table 中的所有字段设置为零,除了

Rails Postgres: set all fields in a table to zero, except for

我有许多 table 每周将所有字段设置为零,少数 select 字段除外(包括外键和一些时间值)。目前,我正在使用 update_all(field: value, ...) 命令,它工作得很好。唯一的问题是我必须列出我要清除的每个字段,而且我经常在更改 table 时忘记在此处添加字段,这会导致错误。

有没有办法让 rails 清除 table 中除了指定的几个字段之外的所有字段?

谢谢!

在 Rails 中每个模型都有方法 columns 其中 returns 列列表。你可以为每个模型做这样的事情:

columns = Entry.columns.map(&:name)
# => ["id", "dish_id", "name", "value"]
columns_to_update = columns - ["id"]
# => ["dish_id", "name", "value"]
columns_with_zero = columns_to_update.map { |c| [c, 0] }.to_h
# => {"dish_id"=>0, "name"=>0, "value"=>0}
Entry.update_all columns_with_zero
# UPDATE "entries" SET "dish_id" = 0, "name" = '0', "value" = 0