it-swarm.com.ru

Значения по умолчанию для моделей в rails

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

12
Denis Papushaev

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

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

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 
26
Sharvy Ahmed

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

# 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
11
w_hile

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

1
Abraham

Ответ на @ w-hile - отличный вариант, если у вас нет нескольких вещей, которые вы хотите сделать «настройками» -

Мне надоело загрязнять мои модели кучей столбцов, посвященных настройкам, поэтому я написал Сетси .

class User < ApplicationRecord

  include ::Setsy::DSL

  # each setting can be a hash, like posts_limit, or just a value
  DEFAULT_SETTINGS = {
    posts_limit: { value: 10 },
    favorite_color: 'blue'
  }.freeze

  setsy :settings, column: :settings_data, defaults: DEFAULT_SETTINGS do |conf|
    conf.reader :posts_limit_and_color do
      "posts limit is #{posts_limit} and color is #{favorite_color}"
    end
  end
end

И ты можешь,

user = User.first
user.settings # {posts_limit: 10, favorite_color: 'blue'}
user.settings.posts_limit # 10
user.settings.posts_limit.default? # true 
user.assign_attributes(settings_data: { posts_limit: 15, favorite_color: 'blue' })
user.settings.posts_limit.default? # false 
user.settings.posts_limit.default # 10 
0
Josh Brody