在 Rails 中,如何轻松地将所有记录重置为模型文件中声明的默认属性值?
In Rails, how can I easily reset all records to the default attribute values declared in the model files?
我有一些table使用单table继承,每个table都有相当数量的模型文件。每个模型文件都设置了一些默认属性,如下所示:
class SpecialWidget < Widget
attribute :name, :string, default: "A Thing"
attribute :description, :text, default: "This is an awfully special widget."
end
这很有用,因为在我的例子中,最终用户无法更改 name
和 description
,所以这是我设置值的好方法,如果我需要,我仍然可以更改这些值到。现在我可以随心所欲地做 SpecialWidget.create
,创建的 SpecialWidget
将具有默认的 name
和 description
.
现在,我希望能够做的是更新一种或多种类型的Widget
的name
或description
通过更改模型文件中的值,如下所示:
class SpecialWidget < Widget
attribute :name, :string, default: "A Thing"
attribute :description, :text, default: "This is a new description for this widget."
end
... 然后 运行 通过脚本或 Rails 控制台的某种命令来重置每个 Widget
的 name
和 description
数据库的默认值。它不应该重置我没有声明默认值的值。
这必须通过代码中的默认声明来完成,而不是通过在数据库架构中设置默认值,因为我使用的是 STI,并且每个模型都有一个不同 name
和 description
.
这听起来像是您正在寻找一些神奇的方法来做到这一点,而实际上只要您接受一个简单的解决方案就可以了,它就可以简单地完成。
例如,这将适用于其中一个模型,SpecialWallet
:
new_default_desc = "This is a new description for this widget."
Wallet.where.not(
description: new_default_desc
).update_all(
description: new_default_desc
)
您将为其他模型和列重复此过程。
我有一些table使用单table继承,每个table都有相当数量的模型文件。每个模型文件都设置了一些默认属性,如下所示:
class SpecialWidget < Widget
attribute :name, :string, default: "A Thing"
attribute :description, :text, default: "This is an awfully special widget."
end
这很有用,因为在我的例子中,最终用户无法更改 name
和 description
,所以这是我设置值的好方法,如果我需要,我仍然可以更改这些值到。现在我可以随心所欲地做 SpecialWidget.create
,创建的 SpecialWidget
将具有默认的 name
和 description
.
现在,我希望能够做的是更新一种或多种类型的Widget
的name
或description
通过更改模型文件中的值,如下所示:
class SpecialWidget < Widget
attribute :name, :string, default: "A Thing"
attribute :description, :text, default: "This is a new description for this widget."
end
... 然后 运行 通过脚本或 Rails 控制台的某种命令来重置每个 Widget
的 name
和 description
数据库的默认值。它不应该重置我没有声明默认值的值。
这必须通过代码中的默认声明来完成,而不是通过在数据库架构中设置默认值,因为我使用的是 STI,并且每个模型都有一个不同 name
和 description
.
这听起来像是您正在寻找一些神奇的方法来做到这一点,而实际上只要您接受一个简单的解决方案就可以了,它就可以简单地完成。
例如,这将适用于其中一个模型,SpecialWallet
:
new_default_desc = "This is a new description for this widget."
Wallet.where.not(
description: new_default_desc
).update_all(
description: new_default_desc
)
您将为其他模型和列重复此过程。