ruby on rails 3 - إضافة: default=> true إلى قيمة منطقية في عمود Rails موجود




ruby-on-rails-3 migration (3)

لقد رأيت بعض الأسئلة (تحديدًا هذه واحدة ) هنا على SO حول إضافة قيمة منطقية افتراضية إلى عمود موجود. لذلك حاولت اقتراح change_column ولكن لا يجب أن أقوم بذلك بشكل صحيح.

حاولت:

$ change_column :profiles, :show_attribute, :boolean, :default => true

الذي يرجع -bash: change_column: command not found

ثم ركضت:

$ rails g change_column :profiles, :show_attribute, :boolean, :default => true

... و

$ rails change_column :profiles, :show_attribute, :boolean, :default => true

ثم ركض rake db:migrate :show_attribute ، لكن بقيت قيمة لـ :show_attribute لا nil . في السؤال الذي أشرت إليه أعلاه ، تقول في PostgreSQL تحتاج إلى تحديثه يدويًا. منذ أن أستخدم PostgreSQL ، أضفت ما يلي في create_profiles :

t.boolean :show_attribute, :default => true

هل يمكن لأحد أن يقول لي ما أفعله خطأ هنا؟


لست متأكدًا من كتابة هذا ، ولكن في الوقت الحالي لإضافة أو إزالة افتراضي من عمود في الترحيل ، يمكنك استخدام ما يلي:

change_column_null :products, :name, false

القضبان 5:

change_column_default :products, :approved, from: true, to: false

http://edgeguides.rubyonrails.org/active_record_migrations.html#changing-columns

القضبان 4.2:

change_column_default :products, :approved, false

http://guides.rubyonrails.org/v4.2/active_record_migrations.html#changing-columns

وهي طريقة أنيقة لتجنب البحث في عمليات الترحيل أو المخطط لمواصفات العمود.


change_column عبارة عن طريقة ActiveRecord::Migration ، لذلك لا يمكنك الاتصال بها مثل ذلك في وحدة التحكم.

إذا كنت ترغب في إضافة قيمة افتراضية لهذا العمود ، فقم بإنشاء ترحيل جديد:

rails g migration add_default_value_to_show_attribute

ثم في الترحيل الذي تم إنشاؤه:

def up
  change_column :profiles, :show_attribute, :boolean, default: true
end

def down
  change_column :profiles, :show_attribute, :boolean, default: nil
end

ثم قم بتشغيل rake db:migrate .

لن يغير أي شيء إلى السجلات التي تم إنشاؤها بالفعل. للقيام بذلك ، سيكون عليك إنشاء rake task أو مجرد الذهاب في rails console وتحديث كافة السجلات.

عند إضافة t.boolean :show_attribute, :default => true إلى الترحيل create_profiles ، فمن الطبيعي إذا لم يفعل أي شيء. يتم تنفيذ عمليات الترحيل فقط التي لم يتم تشغيلها بالفعل. إذا بدأت باستخدام قاعدة بيانات جديدة ، فستقوم بتعيين الإعداد الافتراضي إلى true.


change_column :things, :price_1, :integer, default: 123, null: false

يبدو أن أفضل طريقة لإضافة افتراضي إلى عمود موجود لا يحتوي على قيمة null: false بالفعل.

غير ذلك:

change_column :things, :price_1, :integer, default: 123

بعض الأبحاث التي قمت بها حول هذا:

https://gist.github.com/Dorian/417b9a0e1a4e09a558c39345d50c8c3b







migration