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>

War es hilfreich?

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') }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top