SORU
30 Kasım 2008, Pazar


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
26 ŞUBAT 2011, CUMARTESİ


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:

  1. 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.
  2. 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.
  3. Geçersiz kılma başlatmak işe yarayabilir, ama süper aramayı unutma!
  4. 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ı?
  5. 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:

  1. 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

  1. Eğer sadece ve sadece seçerek bir alt sütunlar için bir model (yani; kullanarak select sorgu gibi Person.select(:firstname, :lastname).all) bir MissingAttributeError eğer init yöntem erişir bir sütun bulunmadı dahil select 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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • HowcastFoodDrink

    HowcastFoodD

    21 EYLÜL 2010
  • Richard Laxa

    Richard Laxa

    30 AĞUSTOS 2012
  • Simon Hayter

    Simon Hayter

    20 HAZİRAN 2010