アジャイルWeb開発(Rails) - ActiveRecord :: StatementInvalid Error

私はRailsには初心者で、「Railsを使ったAgile Web Development:第4版」で作業を始めました。私は現在カート作成の章にいます。私は主に本のコードをコピーしましたが、私のデータベースは「プロダクト」の代わりに「DVD」と呼ばれています(プロジェクトのDVDストアを作成するためです)。

私はこの章の最後に達しました。機能テストを実行すると、次のエラーが発生します。

test_should_destroy_dvd(DvdsControllerTest):
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: line_items.dvd_id: SELECT COUNT(*) FROM "line_items" WHERE ("line_items".dvd_id = 980190962)
app/models/dvd.rb:26:in `ensure_not_referenced_by_any_line_item'
app/controllers/dvds_controller.rb:76:in `destroy'
test/functional/dvds_controller_test.rb:50:in `test_should_destroy_dvd'
test/functional/dvds_controller_test.rb:49:in `test_should_destroy_dvd'

これは参照しているdvd.rbファイルのコードです:

has_many :line_items 
before_destroy :ensure_not_referenced_by_any_line_item
...
private
  def ensure_not_referenced_by_any_line_item
if line_items.empty?
  return true
else
  errors.add(:base, 'Line Items present')
  return false
 end
end

dvds_controller.rbのコード:

def destroy
    @dvd = Dvd.find(params[:id])
    @dvd.destroy

    respond_to do |format|
      format.html { redirect_to(dvds_url) }
      format.xml  { head :ok }
    end
  end

そして、dvds_controller_test.rbのコード:

test "should destroy dvd" do
    assert_difference('Dvd.count', -1) do
      delete :destroy, :id => @dvd.to_param
    end

    assert_redirected_to dvds_path
  end

本質的に、私はエラーを理解していないと私はそれを遠ざけるためにヘルプを探しています!私は問題は "このような列:line_items.dvd_id"と推測していますが、私はそれをどのように修正するのか分かりません。私はそれを理解しようとしている私の脳を溶かしたので、すべてのヘルプは非常に高く評価されるだろう。

Edit: This seems to be where the problem is, in create_line_items.rb:

class CreateLineItems < ActiveRecord::Migration
  def self.up
    create_table :line_items do |t|
      t.integer :product_id
      t.integer :cart_id

      t.timestamps
    end
  end

  def self.down
    drop_table :line_items
  end
end 

また、ここではスチェマです:

ActiveRecord::Schema.define(:version => 20111125123848) do

  create_table "carts", :force => true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "dvds", :force => true do |t|
    t.string   "title"
    t.text     "description"
    t.string   "image_url"
    t.decimal  "price",       :precision => 8, :scale => 2
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "line_items", :force => true do |t|
    t.integer  "product_id"
    t.integer  "cart_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end
0

3 答え

rake db:migrateを実行して、データベースを作成してください。

1
追加された
私はそれを二度チェックしただけで、私は移行を実行しました。ありがとう
追加された 著者 Bobski,

Catと同じように、移行を実行したことを確認しますが、移行で列名を変更するのを忘れている可能性もあります。私の推測では、それは過去にproduct_idだったということです。 LineItemに関連する移行と現在のdb/schema.rbも投稿した場合に役立ちます。

0
追加された
あなたはお金re:product_idです。上記の移行とスキーマコードを使用してオリジナルの投稿を編集しました。これをどうすれば解決できますか?多くのあなたに感謝!
追加された 著者 Bobski,

スキーマは大丈夫だと思います。移行にはdvd_idがありません。どのようにしてあなたのスキーマでdvd_idが終了しましたか?それを追加する別の移行がありますか?

実際にデータベースにあるものを確認することは価値があるかもしれません:

sqlite3 db/development.sqlite3

sqlite3> .schema line_items

line_itemsに実際にdvd_id列があることを確認してください

0
追加された
rename_columnを持つ別の移行を作成する必要があります。その後、rake db:migrateを再実行します。
追加された 著者 ramblex,
ああ、rename_columnを試して問題を解決してみました。 (私は、上記のコードを元の形式に戻して分かりやすくしています)だから正しいですが、私の問題はdvd_id列の代わりにproduct_id列があることです。これをどうすれば解決できますか?
追加された 著者 Bobski,
私はadd_columnを使用して、それは働いたようです。ありがとうございました
追加された 著者 Bobski,