mag*_*egu 3 activerecord ruby-on-rails
当我通过迁移助手创建新列并通过 ruby-active-record-model-code 设置值时。即使更改有效并且 ruby 对象数据看起来不错,新属性毕竟不是通过 ActiveRecord 保存的。
这就是我正在做的详细内容:
我将新列添加到用户模型的架构中:
add_column :users, :billing_day_of_month, :integer
Run Code Online (Sandbox Code Playgroud)
在此之后,也在我的迁移文件中,我想按照一个简单的 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
Run Code Online (Sandbox Code Playgroud)
所有的输出看起来都非常有希望:
precheck 399 true
saved 399 -> 22
precheck 414 true
saved 414 -> 9
precheck 203 true
saved 203 -> 8
precheck 439 true
saved 439 -> 21
Run Code Online (Sandbox Code Playgroud)
不幸的是,模型中的值没有通过 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]]
Run Code Online (Sandbox Code Playgroud)
所以我四处挖掘,发现User.attribute_names缺少新的属性名称billing_day_of_month。当我在迁移后使用 Rails 控制台时,它 User.attribute_names 包含新的属性名称。
顺便说一句,在迁移时,schema.rb 确实包含新列。
有人知道我在这里缺少什么吗?- 我已经通过模型在同一迁移中使用了新的列,并且它始终有效。
User.reset_column_information尝试在更新循环之前添加。有关更多详细信息,请参阅http://api.rubyonrails.org/classes/ActiveRecord/ModelSchema/ClassMethods.html#method-i-reset_column_information 。