Schienen Standardbereich und Standardspaltenwert in der Migration
-
09-10-2019 - |
Frage
class CreateCrews < ActiveRecord::Migration
def self.up
create_table :crews do |t|
t.string :title
t.text :description
t.boolean :adult
t.boolean :private
t.integer :gender_id
t.boolean :approved, :default => false
t.timestamps
end
end
def self.down
drop_table :crews
end
end
class Crew < ActiveRecord::Base
has_many :users, :through => :crew_users
belongs_to :user
default_scope where(:approved => true)
end
Wenn ich die Konsole gehen, und erstellen Sie einen neuen Datensatz, der „genehmigt“ Eigenschaft auf true gesetzt ist, warum?
Wie ich es automatisch auf den Standardwert eingestellt werde (false) wie in meiner Migrationsdatei angezeigt?
wojciech@vostro:~/work/ze$ rails console
Loading development environment (Rails 3.0.0)
ruby-1.9.2-p0 > c = Crew.new
=> #<Crew id: nil, title: nil, description: nil, adult: nil, private: nil, gender_id: nil, approved: true, created_at: nil, updated_at: nil, logo_file_name: nil, logo_content_type: nil, logo_file_size: nil, logo_updated_at: nil>
Lösung
Die Dokumentation fordefault_scope
sagt, dass der Umfang bereitgestellt wird sowohl auf Anfragen und neue Objekte angewendet. Standardwerte auf der Modellebene geliefert werden immer Vorrang vor Standardwerten am Schemaebene zur Verfügung gestellt, weil sie in der Anwendung vorgenommen werden, bevor die Daten immer an die Datenbank gesendet wird.
Sie können unscoped
verwenden, um vorübergehend alle Scoping überspringen (einschließlich der default_scope
). Dies sollte die untere Ebene Datenbank säumige Mechanismus einwirken lassen * .
Crew.unscoped.new
* Active verschleiert den Unterschied zwischen in der Datenbank (Schema) definierte säumige und in der Anwendung (Modell) durchgeführt säumigen. Während der Initialisierung analysiert es das Datenbankschema und stellt fest, alle Standardwerte dort angegeben. Später, beim Erstellen von Objekten, weist er diese Schema angegebene Standardwerte, ohne die Datenbank zu berühren. Zum Beispiel werden Sie approved: false
(statt approved: nil
) im Ergebnis der Crew.unscoped.new
obwohl die Daten nie an die Datenbank geschickt worden, um es zu füllen in dem Standardwert (Active füllt präventiv in dem Standardwert basierend auf Informationen siehe zog es aus dem Schema).
Andere Tipps
Ein kleiner Trick ist die Verwendung
default_scope -> { where('crews.approved = 1') }