rails3 default_scope и значение столбца по умолчанию при переносе - PullRequest
10 голосов
/ 20 октября 2010
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), как показано в моем файле миграции?

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 ]

12 голосов
/ 20 октября 2010

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

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

Crew.unscoped.new

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

1 голос
/ 26 мая 2016

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

default_scope -> { where('crews.approved = 1') }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...