Сделать атрибуты по умолчанию равными 0, если они не указаны или не проверяют численность - PullRequest
5 голосов
/ 17 января 2012

Я хочу, чтобы атрибуты моей модели 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

ОТВЕТ

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

Ответы [ 2 ]

5 голосов
/ 17 января 2012

Вы, вероятно, можете просто поместить его в действие жизненного цикла 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
3 голосов
/ 17 января 2012

В этом случае я бы, вероятно, установил: default => 0,: nil => false в миграциях db.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...