Ist es besser, den Standardwert bei der Migration oder beim Rückruf festzulegen? Es ist schwierig, den Standardwert in der Migration zu löschen (oder einen anderen zu setzen), aber im Modell ist dies ein weiterer Code
Das Definieren von Standardwerten für Ihre Migration hat auch einige Nachteile. Dies funktioniert nicht, wenn Sie einfach Model.new
aufrufen.
Ich ziehe es vor, einen after_initialize
callback zu schreiben, mit dem ich Standardattribute setzen kann:
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
In Rails 5 ermöglicht das attributes API die Angabe von Standardwerten. Die Syntax ist einfach und ermöglicht es Ihnen, einen Standard ohne Migration zu ändern.
# 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
In der Regel erzwingen Sie im Backend Einschränkungen in Modellen und in der Datenbank. Es ist wie eine Validierungs-JS und keine Validierung auf der Backend-Seite (PHP, ROR usw.). Jemand kann Ihre JS ändern, um die Validierung zu bestehen. Da Sie im Backend keine Validierung durchgeführt haben, kann Ihre Site gefährdet sein. Überprüfen Sie daher immer auf beiden Seiten, zumindest wenn Ihr App-Server einen Kompromiss eingeht, kann der DB-Server etwas Abwehrmaßnahmen ergreifen.
Huckepack auf @ w-hile answer - eine großartige Antwort, es sei denn, Sie haben ein paar Dinge, die Sie "Einstellungen" vornehmen möchten -
Ich wurde es satt, meine Modelle mit einer Reihe von Kolumnen zu verschmutzen, die sich mit Einstellungen beschäftigten, also schrieb ich Setsy .
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
Und du kannst,
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