Ruby On Rails更改列为空,不起作用?

14 浏览
0 Comments

Ruby On Rails更改列为空,不起作用?

我在终端中使用命令来将数据库中的一列更改为非空,但似乎没有起作用。

rails g migration change_column_null :Speaker, :surname, false

我得到了一个名为ChangeColumnNull的文件,但里面什么也没有。

class ChangeColumnNull < ActiveRecord::Migration
def change
end
end

讲座控制器(创建函数):

class CplecturesController < ApplicationController
layout 'cp_layout'
 def create
@lecture = Lecture.new(lecture_params)
@lecture.save
redirect_to @lecture
end
private
def lecture_params
  params.require(:lecture).permit(:lecture_title, :lecture_day,   :column, :start_time, :end_time, :registered_speakers, :guest_speakers, :description)
end
end

表单:

<%= form_for :lecture, url:lectures_path do |f| %>
 
<%=label_tag "Lecture Title" %> <%= f.text_field :lecture_title, :class => "form-control", :placeholder => "示例:为什么WordPress是最好的?" %>

0
0 Comments

问题原因:在使用最新版本的Ruby(2.5+)时,将字段从NOT NULL更改为NULL时,上述迁移脚本无效。

解决方法:使用下面的迁移脚本来将字段从NOT NULL更改为NULL。

class ChangeEmailPasswordToNullableUsers < ActiveRecord::Migration[5.2]
  def change
    change_column :users, :email, :string, null: true
    change_column :users, :password, :string, null: true
  end
end

0
0 Comments

问题出现的原因是:在Rails迁移中修改列设置为非空时,使用了错误的语法。

解决方法是:

1. 删除原有的迁移文件,并创建一个新的迁移文件。

2. 在新的迁移文件中,使用change_column方法来修改列设置为非空,并设置默认值。

3. 如果只关心用户输入的值是否为空,可以在模型中添加验证器来要求非空。

4. 确保重启服务器,并检查参数哈希和表单数据是否正确传递。

以下是详细步骤:

1. 使用以下命令删除原有的迁移文件:

rails destroy migration [原有迁移文件名称]

2. 创建一个新的迁移文件:

   rails g migration ChangeColumnOnTableName
   

3. 打开新创建的迁移文件(文件名可能不同),在change方法中添加change_column代码,修改要更改的表、列和数据类型,并设置为非空:

   class ChangeColumnOnTableName < ActiveRecord::Migration
     def change
       change_column :name_of_table, :name_of_column, :data_type_of_column, :null => false
     end
   end
   

4. 运行以下命令来执行迁移:

   bundle exec rake db:migrate
   

5. 在模型中添加验证器来要求非空:

   class TableName < ActiveRecord::Base
     validates :name_of_column, presence: true
   end
   

6. 重启服务器,并确保检查参数哈希和表单数据是否正确传递。

注意:在代码中,将“name_of_table”替换为要更改的表的名称,“name_of_column”替换为要更改的列的名称,“data_type_of_column”替换为列的数据类型。确保将代码的其余部分保持不变。

希望这些步骤能够解决你的问题。如果仍然遇到困难,请提供更多的代码和错误信息,以便我们能够更好地帮助你。

0