Гибкая веб-разработка с Rails - ActiveRecord :: StatementInvalid Ошибка - PullRequest
0 голосов
/ 25 ноября 2011

Я новичок в Rails и начал работать над «Agile Web Development с Rails: четвертое издание».Я в настоящее время в главе Создание корзины.Я в основном скопировал код из книги, однако моя база данных называется «dvds» вместо «products» (потому что я создаю DVD Store для проекта).

Я достиг конца главы, и когда я запускаю функциональные тесты, я получаю следующую ошибку:

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", но я не знаю, как это исправить.Я растопил свой мозг, пытаясь это выяснить, поэтому любая помощь будет весьма признательна.

Редактировать: Кажется, в этом и заключается проблема, в 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

Ответы [ 3 ]

1 голос
/ 25 ноября 2011

Убедитесь, что вы запускаете rake db: migrate, чтобы создать базу данных.

0 голосов
/ 25 ноября 2011

Схема выглядит хорошо, я думаю, миграция отсутствует dvd_id.Как вы попали с dvd_id в вашей схеме?У вас есть другая миграция, которая добавляет ее?

Возможно, стоит проверить, что на самом деле находится в базе данных:

sqlite3 db/development.sqlite3

sqlite3> .schema line_items

Убедитесь, что в line_items действительно есть столбец dvd_id

0 голосов
/ 25 ноября 2011

Как сказал Cat, убедитесь, что вы выполнили миграцию, но также обратите внимание, что вы, возможно, забыли изменить имя столбца в миграции. Я предполагаю, что в прошлом это был product_id. Было бы полезно, если бы вы также опубликовали миграции, связанные с LineItem и текущим db / schema.rb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...