rails3 default_scope и значение столбца по умолчанию при переносе
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
Когда я захожу в консоль и создаю новую запись, свойство "утвержденное" имеет значение "истина", почему?
Как я могу установить для него значение по умолчанию (false), как показано в моем файле миграции?
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>
2 ответа
Документация для default_scope
говорит, что предоставленная область применяется как к запросам, так и к новым объектам. Значения по умолчанию, предоставленные на уровне модели, всегда будут иметь приоритет над значениями по умолчанию, предоставленными на уровне схемы, поскольку они создаются внутри приложения до того, как данные будут отправлены в базу данных.
Ты можешь использовать unscoped
временно пропустить все области видимости (включая default_scope
). Это должно позволить действию механизма дефолта базы данных более низкого уровня *.
Crew.unscoped.new
* ActiveRecord скрывает разницу между значениями по умолчанию, определенными в базе данных (схема), и значениями по умолчанию, выполненными в приложении (модель). Во время инициализации он анализирует схему базы данных и записывает любые значения по умолчанию, указанные там. Позже, при создании объектов, он назначает указанные значения схемы по умолчанию, не касаясь базы данных. Например, вы увидите approved: false
(вместо approved: nil
) в результате Crew.unscoped.new
даже если данные никогда не отправлялись в базу данных, чтобы заставить их заполнить свое значение по умолчанию (ActiveRecord преимущественно заполняет значение по умолчанию на основе информации, которую он извлек из схемы).
Маленькая хитрость заключается в использовании
default_scope -> { where('crews.approved = 1') }