关于您的问题:
- 如果我创建一个迁移并添加一个名为 description 的必需列并运行 db:migrate,未来的产品将需要一个描述,但旧产品呢?
这取决于迁移过程中发生的情况。如果您有所需的值,则应确保迁移旧模型,以便它们之后也有效。如果不是,您将遇到问题,然后尝试更新旧条目,因为您的模型验证将拒绝更新尝试(如果您的更新不包含新的必填字段)
如前所述,这取决于。如果您像这样迁移,那么您的新列将会有某种默认值,那么您就可以了。否则,旧条目将被设置为 NULL。
如果无法以某种方式自动生成您的值或无法应用默认值,是的。
- 如果我为描述设置一个可选值怎么办?这将应用于较旧的实例吗?
如果未在迁移中明确定义,则新列的旧条目将设置为 NULL。
- 如果我重置所有迁移并再次运行它们,我会丢失任何数据吗?
最有可能的是,迁移可以以 UP 和 DOWN 方式构建,但在下行过程中,您会丢失可能无法根据信息丢失恢复的信息。所以删除所有迁移就像删除整个数据库。
但是为什么有人想一次重置所有迁移呢?随着您的数据库不断发展,您应该像对待成长中的孩子一样对待它,您将无法收回他们在教育上花费的时间,但您可以教他们表现得更好,从而忘记不必要的信息(通过进一步的 UP 迁移删除不需要的列)。
处理这种情况的正确方法是什么?在这种情况下您会发展您的架构,可能会呈现无效的旧实例?
你可能会怪我,但这...取决于;)
如果以下更新尝试确保使模型有效,则您根本不必关心。如果没有,您必须在迁移过程中或通过某种脚本或方便的尝试使它们再次有效。