gpt4 book ai didi

ruby - 迁移到单表继承时的 Rails 4 更新类型

转载 作者:数据小太阳 更新时间:2023-10-29 08:27:04 25 4
gpt4 key购买 nike

轨道 4.0.4, ruby 2.1.2

我想像这样使用 STI:

User < ActiveRecord::Base
Admin < User

但目前我有:

User < ActiveRecord::Base
Info < ActiveRecord::Base

所以我更改了我的模型,然后开始编写我的迁移。在我的迁移中,我首先添加一列以允许 STI:

add_column :users, :type, :string

然后我想更新当前在数据库中的用户为Admin

# Place I'm currently stuck

然后我将我所有的信息记录移到用户表中

Info.all.each { |info| User.create(name: info.name, email: info.email) }

除了将以前的用户变成管理员外,一切似乎都正常。以下是我尝试过的一些方法:

# Seems to work, but doesn't actually save type value
User.each do |user|
user.becomes!(Admin)
user.save! # evaluates to true, doesn't have any errors
end

# Seems to work, but doesn't actually save type value
# I've also tried a combo of this one and the above one
User.each do |user|
user.type = "Admin"
user.save! # evaluates to true, doesn't have any errors
end

User.each do |user|
user = user.becomes!(Admin)
user.save! # evaluates to true, doesn't have any errors
end

# Seems to work, but doesn't actually save type value
User.each do |user|
user.update_attributes(type: "Admin")
end

每次本地用户变量似乎都具有正确的类型(“Admin”),并且保存评估为真,但是当我检查 Admin.count 或检查用户类型值时,它是总是零。我知道您不应该更改它们,但这只是将数据迁移到 STI,然后我就可以开始创建具有适当类的用户或管理员。

至少我认为 Rails 应该引发错误、设置错误或以某种方式让开发人员知道保存调用失败。

最佳答案

事实证明,虽然 update_attributes 不适用于类型(我还没有研究为什么),但 update_column 确实有效。

所以迁移简单地变成了:

User.each do |user|
user.update_columns(type: "Admin")
end

此方法有效而其他更新无效的原因可能可以追溯到未运行回调或验证。我没有可以阻止它的回调,但也许有 type

的默认 Rails 回调

http://apidock.com/rails/ActiveRecord/Persistence/update_columns

关于ruby - 迁移到单表继承时的 Rails 4 更新类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26152177/

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