我希望我的UserPrice模型的属性默认为0(如果它们为空或者它没有验证数值)。这些属性是tax_rate,shipping_cost和price。
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
首先,我将:default => 0
放在表格的所有3列中,但我不想这样,因为它已经填写了字段,我想使用占位符。这是我的UserPrice模型:
class UserPrice < ActiveRecord::Base
attr_accessible :price, :tax_rate, :shipping_cost
validates_numericality_of :price, :tax_rate, :shipping_cost
validates_presence_of :price
end
ANSWER
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
答案 0 :(得分:5)
您可以将其置于before_validation
生命周期行动中:
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。如果您在create
操作期间只需要此验证,则可以将其更改为:
before_validation :default_to_zero_if_necessary, :on => :create
答案 1 :(得分:3)
在这种情况下,我可能会设置:default =&gt; 0,:nil =&gt; db迁移中为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
我必须使用格式化电话号码https://github.com/mdeering/attribute_normalizer等更高级的内容时使用属性规范化器。属性规范化器非常适合确保数据格式。
# 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