454 Stimmen

Geländer: Wie kann ich Standardwerte in ActiveRecord setzen?

Wie kann ich einen Standardwert in ActiveRecord festlegen?

Ich sehe einen Beitrag von Pratik, der ein hässliches, kompliziertes Stückchen Code beschreibt: http://m.onkey.org/2007/7/24/how-to-set-default-values-in-your-model

class Item < ActiveRecord::Base  
  def initialize_with_defaults(attrs = nil, &block)
    initialize_without_defaults(attrs) do
      setter = lambda { |key, value| self.send("#{key.to_s}=", value) unless
        !attrs.nil? && attrs.keys.map(&:to_s).include?(key.to_s) }
      setter.call('scheduler_type', 'hotseat')
      yield self if block_given?
    end
  end
  alias_method_chain :initialize, :defaults
end

Beim Herumgoogeln habe ich die folgenden Beispiele gesehen:

  def initialize 
    super
    self.status = ACTIVE unless self.status
  end

und

  def after_initialize 
    return unless new_record?
    self.status = ACTIVE
  end

Ich habe auch schon Leute gesehen, die es in ihre Migration eingebaut haben, aber ich würde es lieber im Modellcode definiert sehen.

Gibt es einen kanonischen Weg, um Standardwert für Felder in ActiveRecord-Modell festlegen?

0voto

Promise Preston Punkte 15324

Ich hatte eine ähnliche Herausforderung bei der Arbeit an einer Rails 6-Anwendung.

So habe ich das Problem gelöst :

Ich habe eine Users Tisch und eine Roles Tisch. Die Users Tabelle gehört zu den Roles Tisch. Ich habe auch eine Admin y Student Modelle, die von der Users Tisch.

Dann musste ich einen Standardwert für die Rolle festlegen, wenn ein Benutzer erstellt wird, z. B. admin Rolle, die eine id hat = 1 o student Rolle, die eine id hat = 2 .

class User::Admin < User
  before_save :default_values

  def default_values
    # set role_id to '1' except if role_id is not empty
    return self.role_id = '1' unless role_id.nil?
  end
end

Dies bedeutet, dass vor einer admin Benutzer in der Datenbank angelegt/gespeichert wird, wird der role_id ist auf einen Standardwert von 1 wenn sie nicht leer ist.

return self.role_id = '1' unless role_id.nil? 

ist dasselbe wie:

return self.role_id = '1' unless self.role_id.nil?

und das gleiche wie:

self.role_id = '1' if role_id.nil?

aber die erste ist sauberer und präziser.

Das ist alles.

Ich hoffe, das hilft

0voto

Yana Agun Siswanto Punkte 1790

Ich benutze das schon eine Weile.

# post.rb
class Post < ApplicationRecord
  attribute :country, :string, default: 'ID'
end

-2voto

jamesc Punkte 11636

Aus den Api-Dokumenten http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html Verwenden Sie die before_validation Methode in Ihrem Modell haben Sie die Möglichkeit, eine spezifische Initialisierung für Create- und Update-Aufrufe zu erstellen In diesem Beispiel (auch hier wurde der Code aus den Api-Dokumenten übernommen) wird das Nummernfeld für eine Kreditkarte initialisiert. Sie können dies leicht anpassen, um beliebige Werte zu setzen

class CreditCard < ActiveRecord::Base
  # Strip everything but digits, so the user can specify "555 234 34" or
  # "5552-3434" or both will mean "55523434"
  before_validation(:on => :create) do
    self.number = number.gsub(%r[^0-9]/, "") if attribute_present?("number")
  end
end

class Subscription < ActiveRecord::Base
  before_create :record_signup

  private
    def record_signup
      self.signed_up_on = Date.today
    end
end

class Firm < ActiveRecord::Base
  # Destroys the associated clients and people when the firm is destroyed
  before_destroy { |record| Person.destroy_all "firm_id = #{record.id}"   }
  before_destroy { |record| Client.destroy_all "client_of = #{record.id}" }
end

Ich bin überrascht, dass er hier noch nicht vorgeschlagen wurde.

-2voto

Viktor Trón Punkte 8506

Verwendung von default_scope in rails 3

Api-Dokument

ActiveRecord verwischt den Unterschied zwischen den in der Datenbank (Schema) definierten Vorgaben und den in der Anwendung (Modell) gemachten Vorgaben. Während der Initialisierung analysiert es das Datenbankschema und notiert alle dort angegebenen Standardwerte. Später, bei der Erstellung von Objekten, weist es diese im Schema definierten Standardwerte zu, ohne die Datenbank zu berühren.

Diskussion

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X