wake-up-neo.com

Standardwerte für Modelle in Schienen

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

12
Denis Papushaev

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

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

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.

1
Abraham

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 
0
Josh Brody