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') }
Другие вопросы по тегам