2016-02-05 3 views
1

У меня есть приложение ruby, где у меня есть модель документов. Документы можно добавить в корзину для загрузки. Как только корзина загружена, предметы в тележке могут быть уничтожены и тележка удалена. Я пытаюсь уничтожить документ. Я получаюRails delete record failed

ActiveRecord::StatementInvalid in DocumentsController#destroy 
TinyTds::Error: Invalid object name 'tl.carts_documents'.: EXEC sp_executesql N'DELETE FROM [tl].[carts_documents] WHERE [tl].[carts_documents].[document_id] = @0; SELECT @@ROWCOUNT AS AffectedRows', N'@0 int', @0 = 3 

Rails.root: C:/Users/cmendla/RubymineProjects/technical_library 

Application Trace | Framework Trace | Full Trace 
app/controllers/documents_controller.rb:150:in `destroy' 
Request 

Parameters: 

{"_method"=>"delete", 
"authenticity_token"=>"T0JBA. . . 3Q==", 
"id"=>"3"} 

.

class Document < ActiveRecord::Base 

    belongs_to :category, :class_name => 'Category', :foreign_key => 'category_id' 
# belongs_to :owner, :class_name => 'Owner', :foreign_key => 'owner_id' 
    has_and_belongs_to_many :carts, :dependent => :destroy 
    accepts_nested_attributes_for :carts 

.

class Cart < ActiveRecord::Base 

    has_and_belongs_to_many :documents 
    has_many :items, :dependent => :destroy 
    accepts_nested_attributes_for :items 

.

class Item < ActiveRecord::Base 
    belongs_to :cart 
end 

. ActiveRecord :: Schema.define (версия: 20160119182713) сделать

create_table "carts", force: :cascade do |t| 
    t.string "user" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 


    create_table "documents", force: :cascade do |t| 
    t.string "document_title" 
    t.text  "summary" 
    t.integer "owner_id" 
    t.integer "category_id" 
    t.datetime "created_at",   null: false 
    t.datetime "updated_at",   null: false 
    t.string "doc_file_file_name" 
    t.string "doc_file_content_type" 
    t.integer "doc_file_file_size" 
    t.datetime "doc_file_updated_at" 
    t.string "owner_index" 
    t.string "category_index" 
    end 

    create_table "items", force: :cascade do |t| 
    t.integer "document_id" 
    t.string "user" 
    t.integer "cart_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    add_index "items", ["cart_id"], name: "index_items_on_cart_id" 

.

def destroy 




    @document.destroy 
    respond_to do |format| 
     format.html { redirect_to documents_url, notice: 'Document was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

Это работает на базе данных Microsoft SQL Server, но я не думаю, что это проблема ограничения. Мой главный вопрос: правильно ли мои модели разрешают удаление документа. Меня не волнует, что это вытирает связанные предметы. После загрузки документов корзина и связанные с ней элементы больше не используются.

+1

выглядит он не может найти таблицу. Работают ли другие запросы? – errata

+1

просто 'принадлежит_to: category' достаточно - вам не нужно указывать ActiveRecord, что': class_name => 'Category',: foreign_key => 'category_id''. Это не java :) – max

+2

Также вам кажется, что отсутствует таблица соединений 'carts_documents' - ее необходимо для отношений habtm. – max

ответ

1

has_and_belongs_to_many отношения ожидает, что таблица соединений будет создана как часть миграции. В вашем случае вам не хватает создания «carts_documents» в вашей миграции.

Визит Active Record Associations и Active Record API для получения дополнительной информации

+0

Это сработало. Я создал модель CartsDocuments с cart_id: integer и document_id: integer, и теперь она работает. –