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

当我进入控制台并创建新记录时,“已批准”属性设置为 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>

4

2 回答 2

12

的文档default_scope说提供的范围适用于查询和新对象。在模型级别提供的默认值将始终优先于在模式级别提供的默认值,因为它们是在数据发送到数据库之前在应用程序内部创建的。

您可以使用unscoped暂时跳过所有范围(包括default_scope)。这应该允许较低级别的数据库默认机制生效* .

Crew.unscoped.new

*ActiveRecord 掩盖了在数据库(模式)中定义的默认值和在应用程序(模型)中完成的默认值之间的区别。在初始化期间,它解析数据库模式并记录那里指定的任何默认值。稍后,在创建对象时,它会分配那些模式指定的默认值,而不涉及数据库。例如,即使数据从未发送到数据库以使其填充其默认值,您也会在结果中看到approved: false(而不是)(ActiveRecord 根据从架构)。 approved: nilCrew.unscoped.new

于 2010-10-20T08:35:24.340 回答
1

一个小技巧是使用

default_scope -> { where('crews.approved = 1') }
于 2016-05-26T08:33:06.080 回答