Ruby on rails 如何向每个模型添加新列?

Ruby on rails 如何向每个模型添加新列?,ruby-on-rails,migration,Ruby On Rails,Migration,通过什么迁移,我可以一次向每个模型添加一列?几乎每次您忘记添加字段时,这都很方便,因为您要添加的字段大部分时间不限于一个模型。像“email”一样,我忘了添加“order”字段 谢谢您可以做如下操作- def change tables = [:users, :products, :addresses] tables.each do |table_name| add_column table_name, :order, :integer end end 这被称为组迁移您可

通过什么迁移,我可以一次向每个模型添加一列?几乎每次您忘记添加字段时,这都很方便,因为您要添加的字段大部分时间不限于一个模型。像“email”一样,我忘了添加“order”字段


谢谢

您可以做如下操作-

def change
  tables = [:users, :products, :addresses]

  tables.each do |table_name|
    add_column table_name, :order, :integer
  end
end

这被称为组迁移

您可以按如下操作-

def change
  tables = [:users, :products, :addresses]

  tables.each do |table_name|
    add_column table_name, :order, :integer
  end
end

这被称为组迁移

回答您的第一个问题“使用什么迁移可以一次向每个模型添加列?”。答:没有。Rails迁移是一种以一致的方式随时间改变数据库模式的方法

Rails迁移是一种Ruby类,使用Rails方法作为指导,根据需要修改数据库。因此,您的问题可以更好地表述为“如何创建一个迁移,以便一次向每个模型添加一列?”

我不认为会有一种特定的方法来实现这一点,因为Requence是非常定制的,但是,根据Rails版本的不同,您可以获得所有的
应用程序记录。子体

Zeitwerk::Loader.eager_load_all
ApplicationRecord.descendants.map { |table| table.name.downcase.pluralize }.each do |table|
  add_column table, :logdate, :datetime
end
或者数据库中可以安全化的所有表:

这样,您可以获得每个表/模型的名称,并将其用作
add\u column
的第一个参数

不同之处在于Rails 6中的默认代码加载程序是Zeitwerk,因此您可以加载所有项目依赖项。在其他版本中,您也可以使用
Rails.application.eager\u load


第二个版本不必将模型作为依赖项加载,因为它会进行查询,询问它们的表,然后将它们映射为常量。

回答您的第一个问题“通过什么迁移可以一次向每个模型添加列?”。答:没有。Rails迁移是一种以一致的方式随时间改变数据库模式的方法

Rails迁移是一种Ruby类,使用Rails方法作为指导,根据需要修改数据库。因此,您的问题可以更好地表述为“如何创建一个迁移,以便一次向每个模型添加一列?”

我不认为会有一种特定的方法来实现这一点,因为Requence是非常定制的,但是,根据Rails版本的不同,您可以获得所有的
应用程序记录。子体

Zeitwerk::Loader.eager_load_all
ApplicationRecord.descendants.map { |table| table.name.downcase.pluralize }.each do |table|
  add_column table, :logdate, :datetime
end
或者数据库中可以安全化的所有表:

这样,您可以获得每个表/模型的名称,并将其用作
add\u column
的第一个参数

不同之处在于Rails 6中的默认代码加载程序是Zeitwerk,因此您可以加载所有项目依赖项。在其他版本中,您也可以使用
Rails.application.eager\u load

第二个版本可以在不必将模型作为依赖项加载的情况下工作,因为它会进行查询,询问它们的表,然后将它们映射为常量