Ruby on rails 如果属性为空或未验证数值性,则将属性默认为0

Ruby on rails 如果属性为空或未验证数值性,则将属性默认为0,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我希望我的UserPrice模型的属性默认为0,如果它们是空的或者没有验证数值性。这些属性是税率、运输成本和价格 class CreateUserPrices < ActiveRecord::Migration def self.up create_table :user_prices do |t| t.decimal :price, :precision => 8, :scale => 2 t.decimal :tax_rate, :pre

我希望我的UserPrice模型的属性默认为0,如果它们是空的或者没有验证数值性。这些属性是税率、运输成本和价格

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
回答

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

在这种情况下,我可能会在db迁移中设置:default=>0,:nil=>false

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

您可能只需在验证前将其放入
生命周期操作中即可:

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
您不需要检查输入是否是字符串,因为Rails在该场景中会默认为0。如果仅在
创建
操作期间需要此验证,则可以将其更改为:

before_validation :default_to_zero_if_necessary, :on => :create
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
before_validation :default_to_zero_if_necessary, :on => :create