0

足場で作成された id 列に問題があります。次のコマンドで足場を生成しました。

rails generate scaffold scaffoldname name:string id:integer

のドロップダウンメニューに使用したい関係にその id 列を使用しましたcollection_select。その後、Rails がテーブルごとに自動的に ID を作成するため、ID を生成する必要がないことに気付きました。

自己作成したIDで関連テーブルを呼び出したい場合、これはもちろん可能です

class.relatedClass.id

その後、テーブルでは列の名前が「rowid」になっていますが、このコマンドはレールがIDを作成したテーブルでも可能であることに気付きました。

そこで、マイグレーションで自己作成の id 列を削除できるはずだと考えました。これについて私が考えた方法は、レールはリレーションに自動的に行 ID を使用するべきだというものでした。しかし、自己作成した ID を削除すると、エラーが発生します。Rails は、scaffold コマンドで id 列が指定されていない場合は使用しますが、自動的に 'rowid' 列を使用することを拒否します。

Railsが後で呼び出したときに独自に作成されたrowidを使用する方法で、その自己作成されたid列を削除するにはどうすればよいclass.relatedClass.idですか?

4

2 に答える 2

2

これをレールターミナルで実行します-

rails g migration remove_id_from_scaffoldname id:integer

 rails g migration add_rowid_to_scaffoldname rowid:integer

これにより、2 つの移行ファイルが作成されます。1 つはidフィールドを削除するためのもので、もう 1 つはフィールドを追加するためのものrowidです。

次に、これをレールターミナルで実行します-

   rake db:migrate

idまた、レールはフィールドを自動的に作成rowidしますが、主キーとしては作成しないことに注意してください。定義した主キーを使用するようにレールを制限するには、ここでこのように明示的に定義する必要があります-

移行ファイル-

create_table :tablename, :primary_key => :rowid do |t|
 # ...
end

あなたのモデル-

class ModelName< ActiveRecord::Base
  self.primary_key = "rowid"
  ...
end

注:id正当な理由がない限り、自動生成された rails を主キーとして使用することをお勧めします。

于 2013-01-17T13:45:55.417 に答える
1

できることの 1 つは、ダウン マイグレーションを実行し、マイグレーションから id フィールドを削除して、アップ マイグレーションを再度実行することです。

生成を実行すると、次のような移行ファイルが作成されました。

db/migrate/20130117134712_create_scaffoldnames.rb

db/migrate の ls を実行すると、他の移行が表示されます

> ls db/migrate
20130114170853_create_server_requests.rb
20130117134712_create_scaffoldnames.rb

db:migrate to the previous version を実行することで、20130117134712_create_scaffoldnames へのダウン マイグレーションを実行できます。

> rake db:migrate VERSION=20130114170853

次に、必要に応じて scaffoldnames の移行を編集し、db:migrate を再度実行します。

私はいつもこれをしています。秘訣は、これらの変更が自分の開発環境に対してローカルである間にこれらの変更をキャッチすることです。

また、十分に早くキャッ​​チすると、実行できます

rails destroy scaffold scaffoldname

足場の生成を元に戻します。

于 2013-01-17T13:51:36.567 に答える