2011-06-11 49 views
4

我不断收到此异常:"SQLite3::SQLException: no such column: books.user_id: SELECT "books".* FROM "books" WHERE ("books".user_id = 4)"。这听起来像书籍表中没有user_id。在表中添加外键

因此,我刚刚安装了Foreigner插件,并在书籍迁移文件中添加了"t.integer :user_id, :null => false""add_foreign_key(:books, :users)"。我跑了"rake db:migrate",但它仍然给我同样的例外。

我在Windows中使用Rails 3并设计来验证用户。

HOME VIEW

<p><%= link_to "Add new Book",:controller =>"book", :action => 'new' %></p> 
    <% @books.each do |b| %> 
    <p><%= b.author%></p> 
    <p><%= b.title%></p> 
    <%end%> 

家庭控制器

class HomeController < ApplicationController 
    def index 
    @user = current_user 
    @user.books||=Book.new 
    @[email protected] 
    end 
    end 

BOOK CONTROLLER

class BookController < ApplicationController 
    def new 
@books = Book.new 
    # redirect_to :controller=>"home" ,:action=>"index" 
    end 

    def create 
    @books = Book.new(params[:book]) 
    if @books.save 
    render "home/index" 
    #redirect_to :controller=>"home" ,:action=>"index" 
    else 

    render :action => 'new' 
    end 
    end 

CREATE TABLE/BOOK MIGRATION

class CreateBooks < ActiveRecord::Migration 
    def self.up 
    create_table :books do |t| 
    t.text :title 
    t.text :author 
    t.integer :user_id, :null => false 
    t.timestamps 
end 
add_foreign_key(:books, :users) 
end 

簿视图

<h1>Book#new</h1> 

<%= form_for(:book) do |f| %> 
<p><%= f.text_field :title %></p> 
<p><%= f.text_field :author %></p> 
<p><%= f.submit "Add book"%> 

Book模型

class Book < ActiveRecord::Base 
belongs_to :user 
end 

用户模型

class User < ActiveRecord::Base 
has_many :books 
# Include default devise modules. Others available are: 
# :token_authenticatable, :lockable, :timeoutable and :activatable 
devise :database_authenticatable, :registerable, 
:recoverable, :rememberable, :trackable, :validatable 

# Setup accessible (or protected) attributes for your model 
attr_accessible :email, :password,    :password_confirmation,:firstname,:lastname,:school,:major,:sex,:zipcode 


    end 

ROUTE 校园:: Application.routes.draw做 GET “书/索引”

get "book/edit" 

    get "book/new" 

    get "home/edit" 

    devise_for :users 
    resources :book  
    root :to=> "home#index" 
    match '/book/new' =>"home#index" 
    end 

数据库模式

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

    create_table "books", :force => true do |t| 
    t.text  "title" 
    t.text  "author" 
    t.integer "user_id", :null => false 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

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

    create_table "strong_ins", :force => true do |t| 
    t.string "subject" 
    t.string "topic" 
    t.text  "description" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "users", :force => true do |t| 
    t.string "email",        :default => "", :null => false 
    t.string "encrypted_password", :limit => 128, :default => "", :null => false 
    t.string "password_salt",      :default => "", :null => false 
    t.string "reset_password_token" 
    t.string "remember_token" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",      :default => 0 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "firstname" 
    t.string "lastname" 
    t.text  "school" 
    t.text  "major" 
    t.string "sex" 
    t.integer "zipcode" 
    end 

    add_index "users", ["email"], :name => "index_users_on_email", :unique => true 
    add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true 

    create_table "weak_ins", :force => true do |t| 
    t.string "subject" 
    t.string "topic" 
    t.text  "description" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

end 

回答

3

user_id列应在运行迁移后出现的模式。它不在您的列表中,所以我会说这是问题。确保rake db:migrate正在完成没有错误。如有必要,您可以使用rake db:rollback && rake db:migrate重新进行迁移。

+0

我刚跑rake db:rollback然后rake db:再次迁移仍然给我同样的异常 – katie 2011-06-11 02:15:09

+0

你可以检查'log/development.log'并看看SQL语句是否被记录? – zetetic 2011-06-11 02:48:59

+0

想想吧,'foreigner'可能不适用于SQLite。尝试删除'add_foreign_key'语句并再次运行迁移。 – zetetic 2011-06-11 02:54:12