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 に答える