Ruby on Rails: Bir geçiş kullanarak var olan bir sütuna boş olmayan bir kısıtlamayı nasıl eklerim?


130

Rails (3.2) uygulamamda, veritabanımda bir sürü tablo var, ancak birkaç boş kısıtlama eklemeyi unuttum. Google'da dolaştım, ancak mevcut bir sütuna boş olmayan bir geçişi nasıl yazacağımı bulamıyorum.

TIA.

Yanıtlar:


93

Rails 4+ için nates'in cevabı ( change_column_null kullanarak ) daha iyidir.

Pre-Rails 4, change_column'u deneyin .


25
Bu yaklaşıma dikkat edin - bu sütunla ilgili başka nitelikleriniz varsa (örneğin bir :limitkısıtlama), kullanırken bu özellikleri tekrarlamanız gerekir change_column, aksi takdirde bunlar kaybolur. Bu nedenle kullanmayı tercih ediyorumchange_column_null
Nathan Wallace

Bunun IrreversibleMigrationistediğiniz gibi olmayabilecek bir ürettiğini unutmayın .
Nic Nilov

@NicNilov yanıttan mı yoksa Nathan Wallace'ın yorumundan mı bahsediyorsunuz?
Mark

@Mark Cevap hakkında konuşuyordum, yeterince spesifik olmadığım için üzgünüm.
Nic Nilov

@NicNilov no dw Bunu iki kez kontrol etmek istememe rağmen düşündüm :)
Mark

274

Change_column_null öğesini de kullanabilirsiniz :

change_column_null :table_name, :column_name, false

8
En temiz cevap!
Josh

1
Bunu bir grup sütun için değiştirmek zorunda kaldım ve bu, her sütun için sütun türünü belirtmeyi gerektirmiyor, çok daha iyi!
Dorian

1
Bu daha iyi cevap. Veritabanımda, önceden var olan boş değerlere sahip bir sütuna boş bir kısıt ekliyordum. change_column bu değerleri güncellemez. Belgelere göre, değişiklik_sütun_null, güncelleme için yeni değer olan isteğe bağlı dördüncü bir değere sahiptir.
Merovex

Bunun için teşekkürler. En iyi cevap.
Ryan Rebo

1
ilginç yan etki .... geçişi geri almak, alanı tersine ayarlayacaktır (yanlış -> doğru). Dolayısıyla, bir boş kısıtlama eklemek için birkaç alan için geçiş oluşturursanız ve bazı alanlarda ZATEN bir boş kısıtlama varsa, ardından geçişi geri alırsanız, zaten buna sahip olan herhangi bir alandan boş kısıtlamayı KALDIRIR.
jpw

10

1) İLK: Varsayılan değeri olan sütun ekleyin

2) SONRA: Varsayılan değeri kaldırın

add_column :orders, :items, :integer, null: false, default: 0
change_column :orders, :items, :integer, default: nil

2
Bu, boş olmayan yeni bir sütun eklemeniz gerektiğinde doğru çözümdür, önce SQLLite şikayet edeceği için varsayılan değere sahip olduğunu tanımlamanız gerekir (Varsayılan değeri NULL olan bir NOT NULL sütunu eklenemez) ve sonra onu kaldırın!
Milan

2

Yeni bir geçiş betiği / şeması üzerinde kullanıyorsanız, işte onu nasıl tanımlayabiliriz?

class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
    t.string :name, null: false     # Notice here, NOT NULL definition
    t.string :email, null: false
    t.string :password, null: false
    t.integer :created_by
    t.integer :updated_by 

    t.datetime :created_at
    t.datetime :updated_at, default: -> { 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' }
   end
  end
end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.