当我通过迁移帮助程序创建新列并通过ruby-active-record-model-code设置值时。即使通过更改是有效的,并且ruby对象数据看起来不错,新属性也不会通过ActiveRecord保存。
这就是我正在做的事情:
我将新列添加到用户模型的架构中:
add_column :users, :billing_day_of_month, :integer
在此之后,同样在我的迁移文件中,我想按照一个简单的ruby公式填充这个新列:
User.customers.each do |u|
day = nil
if u.last_charged_at
day = u.last_charged_at.day
else
day = u.plan_started_at.day
end
u.billing_day_of_month = day
puts "precheck #{u.id} #{u.valid?}"
if u.save
puts "saved #{u.id} -> #{u.billing_day_of_month}"
else
puts "not saved #{u.errors.inspect}"
end
end
所有投放看起来很有希望:
precheck 399 true
saved 399 -> 22
precheck 414 true
saved 414 -> 9
precheck 203 true
saved 203 -> 8
precheck 439 true
saved 439 -> 21
不幸的是,模型中的值未通过ActiveRecord保存:
SQL (0.4ms) UPDATE "users" SET "updated_at" = $1 WHERE "users"."id" = $2 [["updated_at", "2016-01-15 13:01:04.966681"], ["id", 399]]
SQL (0.4ms) UPDATE "users" SET "updated_at" = $1 WHERE "users"."id" = $2 [["updated_at", "2016-01-15 13:01:04.969648"], ["id", 414]]
SQL (0.4ms) UPDATE "users" SET "updated_at" = $1 WHERE "users"."id" = $2 [["updated_at", "2016-01-15 13:01:04.972547"], ["id", 203]]
SQL (0.4ms) UPDATE "users" SET "updated_at" = $1 WHERE "users"."id" = $2 [["updated_at", "2016-01-15 13:01:04.975492"], ["id", 439]]
所以我四处寻找并发现User.attribute_names
缺少新的属性名称billing_day_of_month
。在此迁移后使用rails控制台时,User.attribute_names
确实包含新的属性名称。
在迁移时,schema.rb确实包含新列。
任何人都知道我在这里缺少什么? - 我已经通过模型在同一次迁移中使用了新的cols,它始终有效。
答案 0 :(得分:2)
尝试在更新循环之前添加User.reset_column_information
。有关详细信息,请参阅http://api.rubyonrails.org/classes/ActiveRecord/ModelSchema/ClassMethods.html#method-i-reset_column_information。