Nasıl ActiveRecord varsayılan değerler ayarlayabilirsiniz?
Nasıl ActiveRecord varsayılan değer ayarlayabilirsiniz?
Kod çirkin, karmaşık bir yığın açıklayan Pratik bir post görüyorum: http://m.onkey.org/2007/7/24/how-to-set-default-values-in-your-model
class Item < ActiveRecord::Base
def initialize_with_defaults(attrs = nil, &block)
initialize_without_defaults(attrs) do
setter = lambda { |key, value| self.send("#{key.to_s}=", value) unless
!attrs.nil? && attrs.keys.map(&:to_s).include?(key.to_s) }
setter.call('scheduler_type', 'hotseat')
yield self if block_given?
end
end
alias_method_chain :initialize, :defaults
end
Aşağıdaki örnekler etrafında googling gördüm:
def initialize
super
self.status = ACTIVE unless self.status
end
ve
def after_initialize
return unless new_record?
self.status = ACTIVE
end
Ayrıca insanların göç koy gördüm, ama oldukça model kodu tanımlı görmek istiyorum.
Kurallı bir şekilde ActiveRecord modeli alanlar için varsayılan değeri var mı?
CEVAP
Mevcut yöntemlerin her biri ile çeşitli sorunlar vardır, ama after_initialize bir geri arama tanımlamak aşağıdaki nedenlerle gitmek için yol olduğuna inanıyorum:
- default_scope yeni modeller için değerleri başlatılamıyor, ama o hangi model bulursun kapsamında olacak. Eğer sadece 0 için bazı numaraları başlatmak istiyorsanız o zaman budeğilne istersen.
- Geçiş olarak tanımlayan varsayılanları da zaman parçası çalışır... zaten daha önce de belirttiğimiz Gibi budeğilsadece Model çağrısı çalışma.yeni.
- Geçersiz kılma başlatmak işe yarayabilir, ama süper aramayı unutma!
- Phusion gibi bir eklenti kullanıyor biraz saçma oluyor. Bu yakut, gerçekten sadece bazı varsayılan değerler başlatmak için bir eklenti ihtiyacımız var mı?
- Geçersiz kılma after_initializeolur kaldırılmışolarak 3 Raylar. Ben raylar after_initialize 3.0.3 geçersiz kılmak için konsolda: aşağıdaki uyarı alıyorum
ADMİN UYARI:#after_initialize onaylanmaz, lütfen kullanım Üs.after_initialize :yöntem yerine. (/Users/me/uygulamam/app/models/my_model:15 de denir)
Bu yüzden varsayılan nitelikleri sağlayan after_initialize bir geri arama, yazmak istiyorumek olarakböyle dernekler varsayılanları ayarlayın izin:
class Person < ActiveRecord::Base
has_one :address
after_initialize :init
def init
self.number ||= 0.0 #will set the default value only if it's nil
self.address ||= build_address #let's you set a default association
end
end
Şimdi varsadece bir taneyeri modelleri başlatılması için. Birisi daha iyi bir fikir gelene kadar bu yöntemi kullanıyorum.
Uyarılar:
Boole alanları yapmak için:
öz.öz true bool_field =.bool_field.nil?
Paul Russell'ın bu cevap üzerine yorum daha fazla bilgi için bkz
Eğer sadece ve sadece seçerek bir alt sütunlar için bir model (yani; kullanarak
select
sorgu gibiPerson.select(:firstname, :lastname).all
) bir MissingAttributeError eğerinit
yöntem erişir bir sütun bulunmadı dahilselect
fıkra. Yani bu durumda karşı koruma yapabilirsinizöz.numarası = | | 0.0 kendini.has_attribute? :number
ve bir boolean sütun...
self.bool_field = true if (self.has_attribute? :bool_value) && self.bool_field.nil?
Ayrıca sözdizimi farklı Raylar önce 3.2 (Cliff Sevgilim aşağıya yorum var) olduğunu unutmayın
Nasıl bir HTML <select> öğesi iç...
Nasıl bir C verirsiniz# Otomatik Özell...
Nasıl no-ri-hayır-rdoc gem için varsay...
Nasıl MySQL bir Datetime sütun için va...
Nasıl bower'klasörü varsayılan bi...