2010-10-20 21 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 

Cuando voy a la consola y creo un nuevo registro, la propiedad "aprobada" se establece en verdadero, ¿por qué?rails3 default_scope, y valor de columna predeterminado en la migración

¿Cómo puedo configurarlo automáticamente en el valor predeterminado (falso) como se muestra en mi archivo de migración?

[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>

Respuesta

12

The documentation fordefault_scope dice que el alcance previsto se aplica tanto a las consultas y nuevos objetos. Los valores predeterminados suministrados en el nivel de modelo siempre tendrán prioridad sobre los valores predeterminados proporcionados en el nivel de esquema porque se crean dentro de la aplicación antes de que los datos se envíen a la base de datos.

Puede usar unscoped para omitir temporalmente todo el alcance (incluido el default_scope). Esto debería permitir que el mecanismo de incumplimiento de base de datos de nivel inferior surta efecto *.

Crew.unscoped.new 

* ActiveRecord oscurece la diferencia entre Incumplidora se define en la base de datos (esquema) y Incumplidora hecho en la aplicación (modelo). Durante la inicialización, analiza el esquema de la base de datos y toma nota de los valores predeterminados allí especificados. Más tarde, al crear objetos, asigna los valores predeterminados especificados por el esquema sin tocar la base de datos. Por ejemplo, verá approved: false (en lugar de approved: nil) en el resultado de Crew.unscoped.new aunque los datos nunca se hayan enviado a la base de datos para que llene su valor predeterminado (ActiveRecord rellena de manera preventiva el valor predeterminado según la información que extrajo) fuera del esquema).

+0

+1. Esta documentación está realmente ausente en las versiones anteriores de los documentos API. Inicialmente tuve que buscar en la fuente para descubrir por qué está sucediendo eso. (Esto significa que debemos contribuir más a 'docrails' (https://github.com/lifo/docrails) – Swanand

+4

Encuentro esta" característica "muy molesta. Quiero decir, lo que quiero buscar no tiene relación con lo que quiero a creado. – Zequez

1

Un pequeño truco es utilizar

default_scope -> { where('crews.approved = 1') } 
Cuestiones relacionadas