ruby on rails - كيف يمكن تغيير عمود nullable إلى nullable في ترحيل Rails؟




ruby-on-rails migration (5)

لقد أنشأت عمود تاريخ في عملية ترحيل سابقة وأعدته ليكون صالحًا. الآن أريد تغييره ليكون غير صالح. كيف يمكنني القيام بذلك بافتراض وجود صفوف فارغة في قاعدة البيانات تلك؟ أنا على ما يرام مع وضع تلك الأعمدة على Time.now إذا كانت فارغة في الوقت الحالي.


أنشئ عملية ترحيل تحتوي على عبارة change_column مع a :default => value.

change_column :my_table, :my_column, :integer, :default => 0, :null => false

انظر: change_column

اعتمادا على محرك قاعدة البيانات قد تحتاج إلى استخدام change_column_null


إذا كنت تفعل ذلك في عملية ترحيل ، فيمكنك القيام بذلك على النحو التالي:

# Make sure no null value exist
MyModel.where(date_column: nil).update_all(date_column: Time.now)

# Change the column to not allow null
change_column :my_models, :date_column, :datetime, null: false

القضبان 4:

def change
  change_column_null(:users, :admin, false )
end

في Rails 4.02+ طبقًا docs لا توجد طريقة مثل update_all مع update_all . بدلا من ذلك يمكن للمرء استخدام هذا الرمز:

# Make sure no null value exist
MyModel.where(date_column: nil).update_all(date_column: Time.now)

# Change the column to not allow null
change_column :my_models, :date_column, :datetime, null: false

لا يمكنك استخدام add_timestamps و null: false إذا كان لديك سجلات حالية ، لذلك هنا هو الحل:

def change
  add_timestamps(:buttons, null: true)

  Button.find_each { |b| b.update(created_at: Time.zone.now, updated_at: Time.zone.now) }

  change_column_null(:buttons, :created_at, false)
  change_column_null(:buttons, :updated_at, false)
end






migration