3

このレベルで Rails のデータベースを扱うのは初めてで、数時間探しましたが、この特定の問題に対する解決策が見つかりませんでした。

バージョン: Rails 3.2.9、Ruby 1.9.3、MySQL 5.5.28 (mysql2 gem 2.9.0)、Mac OS 10.7.5

エラー:

ActiveRecord::StatementInvalid in Action_figures#list

Mysql2::Error: Unknown column 'action_figures.position' in 'order clause': SELECT `action_figures`.* FROM `action_figures`  ORDER BY action_figures.position ASC

抜粋ソース(14行目あたり): [list.html.erb]

11:       <th>Visible</th>
12:       <th>Actions</th>
13:     </tr>
14:     <% @action_figures.each do |action_figure| %>
15:     <tr>
16:       <td><%= action_figure.position %></td>
17:       <td><%= action_figure.name %></td>

ActionFigures モデルとコントローラーを生成しましたが、移行ファイルで:position、:name などを後で指定しました。

class CreateActionFigures < ActiveRecord::Migration
  def change
    create_table :action_figures do |t|
      t.string "name"
      t.integer "position"
      t.boolean "visible", :default => false
      t.timestamps
    end
  end
end

そして、これはモデルで:

class ActionFigure < ActiveRecord::Base
  has_many :pages
  attr_accessible :name, :position, :visible
end

私はrake db:migrateすでに数回実行し、サーバーを停止して再起動し、ターミナルを閉じて再度開いて、それがそれらのものではないことを確認しましたが、そうすると:

mysql> SHOW FIELDS FROM action_figures;

次の表を取得します。

+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| created_at | datetime | NO   |     | NULL    |                |
| updated_at | datetime | NO   |     | NULL    |                |
+------------+----------+------+-----+---------+----------------+

質問:

  1. :name、:position、:visible がテーブルに表示されないのはなぜですか?
  2. 今すぐ追加するにはどうすればよいですか?
4

2 に答える 2

1

古い ActionFigures 移行ファイルで位置、名前、その他すべてを指定した場合db:migrate、そのファイルの変更は反映されません。

schema.rbdb フォルダー内のファイルを見ると、バージョン番号があります。その番号は、最後に実行された移行ファイルの番号と一致します。そのため、実行rake db:migrateするとその数が考慮されるため、その前に移行が再実行されることはありません。これは、テーブルが再作成されないようにするために発生します...

いくつかのオプションがあります:

  1. rake db:rollbackその後、他の移行を行っていない場合は、ActionFigure テーブルの作成の変更を元に戻すためにaを実行します。

  2. rake db:drop次にrake db:createrake db:migrate移行で行った変更を使用してテーブルを再作成します。

  3. 移行ファイルで行った変更を削除し、and を使用して新しい移行を行い、テーブルに変更を加えますrails g migration add_name_and_position_to_action_figures name position:integerrake db:migrate

他の方法もありますが、データベースにあるデータに応じて、2 または 3 のいずれかを使用します。

お役に立てれば!

于 2012-12-11T21:50:32.547 に答える
0

テーブルを追加し、移行を実行し、移行ファイルを編集して位置と可視属性を追加しましたか? その場合は、新しい移行を追加する (または最後の移行を再実行する) 必要があります。

これを試して;

rails g migration add_position_to_action_figures position:integer visible:boolean

bundle exec rake db:migrate
于 2012-12-11T21:51:43.030 に答える