2012-01-17 29 views
5

Kullanıcı Fiyatım modelimin öznitelikleri boşsa veya sayıları doğrulanmıyorsa varsayılan değer olarak 0 olmasını istiyorum. Bu özellikler tax_rate, shipping_cost ve fiyattır. İlk baştaÖznitelikler boşsa veya sayısal değilse doğrulanır

class CreateUserPrices < ActiveRecord::Migration 
    def self.up 
    create_table :user_prices do |t| 
     t.decimal :price, :precision => 8, :scale => 2 
     t.decimal :tax_rate, :precision => 8, :scale => 2 
     t.decimal :shipping_cost, :precision => 8, :scale => 2 
    end 
    end 
end 

, tüm 3 sütunlar için tablonun içine :default => 0 koymak ama istemiyordu zaten doldurulmuş alanları vardı ve tutucuları kullanmak istiyorum çünkü. Muhtemelen kuracak Bu durumda

class UserPrice < ActiveRecord::Base 
    attr_accessible :price, :tax_rate, :shipping_cost 
    validates_numericality_of :price, :tax_rate, :shipping_cost 
    validates_presence_of :price 
end 

CEVAP

before_validation :default_to_zero_if_necessary, :on => :create 

private 

def default_to_zero_if_necessary 
    self.price = 0 if self.price.blank? 
    self.tax_rate = 0 if self.tax_rate.blank? 
    self.shipping_cost = 0 if self.shipping_cost.blank? 
end 

cevap

3

: => 0 varsayılan: db göçlerde nil => false İşte benim UserPrice modelidir. Bir telefon numarası https://github.com/mdeering/attribute_normalizer biçimlendirme gibi daha gelişmiş şeyler yapmak zorunda yaparken

class CreateUserPrices < ActiveRecord::Migration 
    def self.up 
    create_table :user_prices do |t| 
     t.decimal :price, :precision => 8, :scale => 2, :default => 0, :nil => false 
     t.decimal :tax_rate, :precision => 8, :scale => 2, :default => 0, :nil => false 
     t.decimal :shipping_cost, :precision => 8, :scale => 2, :default => 0, :nil => false 
    end 
    end 
end 

Ben Özellik Normalizeri kullanın. Nitelik normalleştirici, veri formatını sağlamak için gerçekten iyidir.

# here I format a phone number to MSISDN format (004670000000) 
normalize_attribute :phone_number do |value| 
    PhoneNumberTools.format(value) 
end 

# use this (can have weird side effects) 
normalize_attribute :price do |value| 
    value.to_i 
end 

# or this. 
normalize_attribute :price do |value| 
    0 if value.blank? 
end 
5

Muhtemelen sadece bir before_validation yaşam döngüsü eylem yerleştirebilirsiniz:

before_validation :default_to_zero_if_necessary 

private 
    def default_to_zero_if_necessary 
    price = 0 if price.blank? 
    tax_rate = 0 if tax_rate.blank? 
    shipping_cost = 0 if shipping_cost.blank? 
    end 

Sen girdi Raylar zaten bu senaryoda 0 olarak varsayılan olacağından bir dize olup olmadığını kontrol etmek gerekmez . create eylemi sırasında yalnızca bu doğrulamaya ihtiyacınız varsa, bunu şu şekilde değiştirebilirsiniz:

before_validation :default_to_zero_if_necessary, :on => :create