【问题标题】:Rails Activerecord adding columns to multiple tablesRails Activerecord 向多个表添加列
【发布时间】:2020-02-06 05:57:34
【问题描述】:

我需要进行迁移,将一列添加到三个单独的表中。视图列是一个整数,还需要默认 => 0。如何使用 activerecord 命令添加这些列?我正在使用 postgreSQL 数据库。

我的迁移应该是这样的:

class AddViewsToRestaurantsMenusDishes < ActiveRecord::Migration[6.0]
   def change
     add_column Restaurant, :views, :integer, :default => 0
     add_column Menu, :views, :integer, :default => 0
     add_column Dish, :views, :integer, :default => 0
   end
end

【问题讨论】:

  • the guide 有什么不清楚的地方?
  • 我找不到它说如何为多个表添加列以及如何设置默认值 => 0
  • 你试过add_column :restaurants, :views, :integer, default: 0吗?重复两次,将:restaurants 更改为:menus:dishes?
  • 该命令不正确。我在某个地方看到迁移使用模型名称作为第一个参数,这也让我觉得很奇怪。
  • "add_column :restaurants, :views, :integer, default: 0" 进行空迁移。正确的方法是“AddViewsToTeams 视图:整数”。但这并不像上面的例子那样模型是第一个参数。在 views:integer 之后添加 default:0 只是使其成为另一列而不是使视图成为默认值 => 0

标签: ruby-on-rails database postgresql activerecord rails-activerecord


【解决方案1】:

add_column(table_name, column_name, type, **options)

class AddViewsToRestaurantsMenusDishes < ActiveRecord::Migration[6.0]
   def change
     add_column :restaurants, :views, :integer, default: 0
     add_column :menus, :views, :integer, default: 0
     add_column :dishes, :views, :integer, default: 0
   end
end

构成整个迁移 DSL 的 ActiveRecord::ConnectionAdapters::SchemaStatementsActiveRecord::ConnectionAdapters::TableDefinition 中没有一个方法将模型作为参数 - 一直都是所有表。

这假定您的表是按惯例命名的。如果您真的想从模型类列表中做同样的事情,您可以这样做:

class AddViewsToRestaurantsMenusDishes < ActiveRecord::Migration[6.0]
   def change
     [Restaurant, Menu, Dish].each do |model|
       add_column model.table_name, :views, :integer, default: 0
     end
   end
end

但是对于迁移来说,KISS 通常是个好主意。尤其是因为它们不应该在项目的整个生命周期中都存在。

【讨论】:

    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多