Ruby on rails 如果属性为空或未验证数值性,则将属性默认为0
我希望我的UserPrice模型的属性默认为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
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