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

Когда я иду на консоль и создаю новую запись, для свойства "approved" установлено значение true, почему?

Как я могу установить его автоматически на значение по умолчанию (false), как показано в моем файле миграции?

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

Ответ 1

В документации для default_scope указано, что предоставленная область применения применяется как к запросам, так и к новым объектам. Значения по умолчанию, заданные на уровне модели, всегда будут иметь приоритет над значениями по умолчанию, указанными на уровне схемы, потому что они сделаны внутри приложения до того, как данные когда-либо отправляются в базу данных.

Вы можете использовать unscoped для временного пропуска всех областей охвата (включая default_scope). Это должно позволить эффективному механизму деблокирования базы данных нижнего уровня *.

Crew.unscoped.new

* ActiveRecord скрывает разницу между дефолтом, определенным в базе данных (схема), и по умолчанию выполняется в приложении (модели). Во время инициализации он анализирует схему базы данных и отмечает любые значения по умолчанию, указанные там. Позже, создавая объекты, он присваивает эти значения по умолчанию для схемы, не касаясь базы данных. Например, вы увидите approved: false (вместо approved: nil) в результате Crew.unscoped.new, даже если данные никогда не были отправлены в базу данных, чтобы получить его значение по умолчанию (ActiveRecord превентивно заполняет значение по умолчанию значение на основе информации, которую он вытащил из схемы).

Ответ 2

Небольшой трюк заключается в использовании

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