活动记录忽略迁移中的新属性

时间:2016-01-15 13:10:03

标签: ruby-on-rails activerecord

当我通过迁移帮助程序创建新列并通过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,它始终有效。

1 个答案:

答案 0 :(得分:2)

尝试在更新循环之前添加User.reset_column_information。有关详细信息,请参阅http://api.rubyonrails.org/classes/ActiveRecord/ModelSchema/ClassMethods.html#method-i-reset_column_information