2010-10-20 14 views
10
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 

Quando vado in console e creo un nuovo record, la proprietà "approvata" è impostata su true, perché?rails3 default_scope e valore di colonna predefinito nella migrazione

Come posso impostarlo automaticamente sul valore predefinito (falso) come mostrato nel mio file di migrazione?

[email protected]:~/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>

risposta

12

The documentation fordefault_scope dice che il campo di applicazione previsto si applica a entrambe le query e nuovi oggetti. I valori predefiniti forniti a livello di modello avranno sempre la precedenza sui valori predefiniti forniti a livello di schema, poiché vengono creati all'interno dell'applicazione prima che i dati vengano inviati al database.

È possibile utilizzare unscoped per ignorare temporaneamente tutti gli ambiti (incluso lo default_scope). Ciò dovrebbe consentire che il meccanismo di default del database di livello inferiore abbia effetto *.

Crew.unscoped.new 

* ActiveRecord oscura la differenza tra inadempiente definito nel database (schema) e inadempiente fatto nella domanda (modello). Durante l'inizializzazione, analizza lo schema del database e annota tutti i valori predefiniti specificati lì. Successivamente, durante la creazione di oggetti, assegna i valori predefiniti specificati dallo schema senza toccare il database. Ad esempio, vedrai approved: false (anziché approved: nil) nel risultato di Crew.unscoped.new anche se i dati non sono mai stati inviati al database per farlo riempire il suo valore predefinito (ActiveRecord riempie preventivamente il valore predefinito in base alle informazioni che ha tirato fuori dallo schema).

+0

+1. Questa documentazione è in realtà assente nelle versioni precedenti dei documenti API. Ho dovuto scavare inizialmente alla fonte per scoprire perché sta succedendo così. (Ciò significa che dobbiamo contribuire maggiormente a 'docrails' (https://github.com/lifo/docrails) – Swanand

+4

Trovo molto fastidiosa questa" funzionalità " Voglio dire, quello che voglio cercare è completamente estraneo a quello che voglio da creare. – Zequez

1

Un piccolo trucco è quello di utilizzare

default_scope -> { where('crews.approved = 1') } 
Problemi correlati