Значения по умолчанию для моделей в рельсах

Лучше ли устанавливать значение по умолчанию в процессе миграции или в обратном вызове? Сложно удалить (или установить другое) значение по умолчанию в процессе миграции, но в модели это еще один фрагмент кода

Ответ 1

Определение параметров по умолчанию в вашей миграции также имеет некоторые недостатки. Это не будет работать, когда вы просто вызываете Model.new.

Я предпочитаю писать обратный вызов after_initialize, который позволяет мне устанавливать атрибуты по умолчанию:

class Model < ActiveRecord::Base
  after_initialize :set_defaults, unless: :persisted?
  # The set_defaults will only work if the object is new

  def set_defaults
    self.attribute  ||= 'some value'
    self.bool_field = true if self.bool_field.nil?
  end
end 

Ответ 2

В Rails 5 атрибут API позволяет специфицировать значения по умолчанию. Синтаксис прост и позволяет изменять значение по умолчанию без переноса.

# db/schema.rb
create_table :store_listings, force: true do |t|
  t.string :my_string, default: "original default"
end

# app/models/store_listing.rb
class StoreListing < ActiveRecord::Base
  attribute :my_string, :string, default: "new default"
end

Ответ 3

Как правило, на бэкэнд применяются ограничения в моделях и в БД. Это похоже на проверку JS и не проверку на стороне сервера (PHP, ROR и т.д.). Кто-то может изменить ваш JS, чтобы передать проверку, и поскольку вы не подтвердили на бэкэнд, ваш сайт может быть скомпрометирован. Таким образом, проверяйте всегда в обеих сторонах, по крайней мере, если ваш сервер приложений получает компромисс, сервер БД может выставить некоторую защиту.