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

Kiedy idę do konsoli i utworzyć nowy rekord, „Solidny” właściwość jest ustawiona na wartość true, to dlaczego?rails3 default_scope i domyślną wartość kolumny w migracji

Jak mogę ustawić go automatycznie na wartość domyślną (fałsz), jak pokazano w moim pliku migracji?

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

Odpowiedz

12

The documentation fordefault_scope mówi, że warunkiem zakres jest stosowane zarówno do zapytań i nowych obiektów. Wartości domyślne podane na poziomie modelu będą zawsze miały pierwszeństwo przed wartościami domyślnymi podanymi na poziomie schematu, ponieważ są wprowadzane wewnątrz aplikacji, zanim dane zostaną kiedykolwiek wysłane do bazy danych.

Możesz użyć unscoped, aby tymczasowo pominąć wszystkie zakresy (w tym default_scope). To powinno umożliwić działanie mechanizmu domyślnego bazy danych niższego poziomu *.

Crew.unscoped.new 

* ActiveRecord zaciera różnicę między zalegających zdefiniowane w bazie danych (schemat) i zalegających zrobić w aplikacji (model). Podczas inicjowania analizuje schemat bazy danych i odnotowuje tam wszelkie wartości domyślne. Później, podczas tworzenia obiektów, przypisuje te domyślne wartości określone w schemacie bez dotykania bazy danych. Na przykład pojawi się approved: false (zamiast approved: nil) w wyniku Crew.unscoped.new, mimo że dane nigdy nie zostały wysłane do bazy danych, aby uzyskać wypełnienie jej wartości domyślnej (ActiveRecord prewencyjnie wypełnia domyślną wartość na podstawie wyciągniętych informacji poza schematem).

+0

+1. Ta dokumentacja jest w rzeczywistości nieobecna w starszych wersjach dokumentacji API. Musiałem początkowo zagłębić się w źródło, aby dowiedzieć się, dlaczego tak się dzieje. (Oznacza to, że musimy wnosić więcej do "docrails" (https://github.com/lifo/docrails) – Swanand

+4

Uważam, że ta "funkcja" jest bardzo denerwująca. To znaczy, to, czego chcę szukać, jest zupełnie niezwiązane z tym, czego chcę do stworzenia. – Zequez

1

mały trick jest użycie

default_scope -> { where('crews.approved = 1') } 
Powiązane problemy