ActiveRecord:更改现有列默认值的最简单方法

时间:2019-08-17 23:23:18

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

背景

我的数据库包含两个表,这些表是我用rails g migration创建的。

一个表包含电视节目,其中有几列数据描述每个节目。一列称为:watchlist。我忘记将:watchlist的默认值设置为false,因为每个新节目的监视列表值都应该为false。在我的前端,我希望能够将此值从false切换为true(将程序添加到监视列表的操作会将值从false更改为true)。

我尝试过的东西

我正在为后端使用Rails API,因此我咨询了documentation并尝试使用以下代码来更改change_column_default:

rails change_column_default :program, :watchlist, from: nil, to: false

但出现此错误:

Don't know how to build task 'change_column_default' (See the list of available tasks with `rails --tasks`)

我尝试了rails --tasks,但是在生成的列表中没有看到我需要的内容。

搜索其他问题后,我发现了this one,但如果不需要的话,宁愿不在模型上执行此操作。

当前(不正确)迁移。 :watchlist应该是t.boolean :watchlist, default: false

class CreatePrograms < ActiveRecord::Migration[6.0]
  def change
    create_table :programs do |t|
      t.string :url
      t.string :name
      t.string :network
      t.string :image
      t.boolean :watchlist

      t.timestamps
    end
  end
end

程序模型

class Program < ApplicationRecord
  has_many :comments

  validates :name, :network, presence: true

end

程序序列化器

class ProgramSerializer < ActiveModel::Serializer
  attributes :id, :name, :network, :image, :watchlist

  has_many :comments
end

问题总结

  1. 我可以从命令行更新现有表中的一列吗?
  2. 如果没有,我应该如何更改当前代码?

谢谢您的时间!

2 个答案:

答案 0 :(得分:1)

您应在迁移文件中使用change_column_default方法。

  1. 生成迁移文件

    rails g migration add_default_false_to_watchlist_for_programs
    
  2. 向迁移文件添加change_column_default方法

    class AddDefaultFalseToWatchlistForPrograms < ActiveRecord::Migration
      def change
        change_column_default :programs, :watchlist, from: nil, to: false
      end
    end
    
  3. 运行rails db:migrate

答案 1 :(得分:1)

这是因为change_column_default不是瑞克任务

  • 您需要生成迁移rails g migration add_default_value_to_watchlist_for_programs,这将生成迁移文件。

  • 然后,您需要添加一行,告诉活动记录在我们创建的迁移中设置默认值 change_column_default :programs, :watchlist, from: nil, to: false

  • 然后您需要通过rails db:migrate
  • 运行迁移