0

モデルに基づいて移行がどのように更新されるのか理解できません。

たとえば、私はデバイスをセットアップしており、電子メール フィールドを削除して、ユーザー名とパスワード フィールドのみを使用したいと考えています。

だから、私はやった

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :username, :password
  # attr_accessible :title, :body
end

ただし、移行ファイルにはこれらの変更が反映されません。

rake db:migrate

また

 rake db:reset

移行ファイルにはまだ電子メール フィールドがあります

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      ## Database authenticatable
      t.string :email,              :null => false, :default => ""
      t.string :encrypted_password, :null => false, :default => ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, :default => 0
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip

      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at

      ## Token authenticatable
      # t.string :authentication_token


      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    # add_index :users, :confirmation_token,   :unique => true
    # add_index :users, :unlock_token,         :unique => true
    # add_index :users, :authentication_token, :unique => true
  end
end

また、Rails が新しいファイルを作成することを認識できるように、移行ファイルを削除しようとしています。しかし、これは機能せず、移行はまだどこかから実行されていましたか? これらの移行はどこから実行されましたか? その時点で私の db/migrate ファイルは空だったことに注意してください。

-- create_table("users", {:force=>true})
   -> 0.2476s
-- add_index("users", ["email"], {:unique=>true, :name=>"index_users_on_email"})
   -> 0.1832s
-- add_index("users", ["reset_password_token"], {:unique=>true, :name=>"index_users_on_reset_password_token"})
   -> 0.1832s
-- initialize_schema_migrations_table()
   -> 0.3776s
-- assume_migrated_upto_version(20130320033132, ["/home/Portfolio Rails/portfolio/db/migrate"])
   -> 0.1532s
4

2 に答える 2

1

あなたはこれをすべて逆に持っています。移行はディスク上のファイルです。Railsに生成を依頼することはできますが、「自分自身を更新」することはありませんが、データベースやモデルの状態ではなく、入力に基づいてこれを実行します。

変更はモデルから移行に流れるのではなく、データベースを介して移行からモデルに流れます。開発者であるあなたは、新しい移行を導入することによってデータベースに変更を加える責任があります。フィールドを削除する場合は、その列を削除する新しい移行を作成する必要があります。

ランニングrake db:migrateは、あなたが思っていることとは逆のことをします。移行からではなく、移行から状態をコピーます。db/migrateデータベースの状態を変更する方法の説明を含む新しいファイルがあるかどうかを調べます。

于 2013-03-20T04:12:05.910 に答える
1

移行ファイルは、スキーマに加えた変更の単なる記録です。それらを変更しても、データベース自体には何も影響しません。

メール フィールドを削除する移行を作成する必要があります。

rails generate migration remove_email_from_users email:string
rake db:migrate
于 2013-03-20T04:14:33.483 に答える