【问题标题】:Rails Postgres: set all fields in a table to zero, except forRails Postgres:将表中的所有字段设置为零,除了
【发布时间】:2017-06-18 21:58:55
【问题描述】:
我有许多表,我每周将所有字段设置为零,除了少数选择的字段(包括外键和一些时间值)。目前,我正在使用 update_all(field: value, ...) 命令,它工作得很好。唯一的问题是我必须把每个我想清除的字段都列出来,而且我经常在换表时忘记在此处添加字段,从而导致错误。
有没有办法让 rails 清除表中除了指定的少数字段之外的所有字段?
谢谢!
【问题讨论】:
标签:
sql
ruby-on-rails
postgresql
rails-activerecord
update-all
【解决方案1】:
在 Rails 中,每个模型都有方法 columns,它返回列列表。你可以为每个模型做这样的事情:
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