gpt4 book ai didi

ruby-on-rails - rails 3.1 : can't write to column in same migration that adds it

转载 作者:行者123 更新时间:2023-12-03 11:17:36 24 4
gpt4 key购买 nike

我有一个运行良好的 add_column 迁移。但是,在运行它并启动控制台后,我会发现 first_name 和 last_name 列完全为空。我尝试使用 save!相反,它具有相同的效果——没有报告错误。这是原文:

class UserAddFirstNameAndLastName < ActiveRecord::Migration
def change
# add column first name, last name string
add_column :users, :first_name, :string
add_column :users, :last_name, :string

User.all.each do |u|
u.first_name = 'first name'
u.last_name = 'last name'
u.save
end
end
end

我还认为这可能是一些类加载问题,所以我插入了 User 行强制用户类在循环之前重新加载。没有骰子。

当我把它分成两个迁移时,达到了预期的效果。有人对此有解释吗?我发誓我什至在过去迁移的同一个项目中做过这个。

其他说明:为用户引擎设计,将新列添加到 attr_accessible在运行迁移之前在用户类中。

最佳答案

在迁移运行之前,您正在某处加载 Users 类,所以 User对自己的结构有点困惑。解决办法是调用 reset_column_information 添加列后:

Resets all the cached information about columns, which will cause them to be reloaded on the next request.

The most common usage pattern for this method is probably in a migration, when just after creating a table you want to populate it with some default values



Using Models in Your Migrations Migrations Guide 的部分可能也值得一看。

尝试回滚并使用如下迁移:
def change
# add column first name, last name string
add_column :users, :first_name, :string
add_column :users, :last_name, :string

User.reset_column_information

User.all.each do |u|
u.first_name = 'first name'
u.last_name = 'last name'
u.save
end
end

我用这样的三个迁移检查了这一点:
# 1: Don't touch Model before the new columns.
def change
add_column :models, :some_column, :string
Model.all.each { |m| m.some_column = 'pancakes'; m.save }
end

# 2: Pull in Model before adding the new columns.
def change
puts Model.all.count
add_column :models, :some_column, :string
Model.all.each { |m| m.some_column = 'pancakes'; m.save }
end

# 3: Pull in Model before adding the new columns but use reset_column_information
def change
puts Model.all.count
add_column :models, :some_column, :string
Model.reset_column_information
Model.all.each { |m| m.some_column = 'pancakes'; m.save }
end

第一个工作正常,第二个添加 some_column但将其保留为 NULL 值,第三个也可以。

我猜想你的应用程序初始化中的某些东西(可能来自设计)导致用户及其模式被加载,然后你添加一个列。但是,显然,用户只知道部分新列是 u.first_name。调用有效,但在 User 内部缓存了一些内容,以防止将属性写入数据库。

关于ruby-on-rails - rails 3.1 : can't write to column in same migration that adds it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8935350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com