Hinzufügen eines Fremdschlüssels in der Tabelle
-
26-10-2019 - |
Frage
Ich bekomme immer wieder diese Ausnahme: "SQLite3::SQLException: no such column: books.user_id: SELECT "books".* FROM "books" WHERE ("books".user_id = 4)"
. Was so klingt, als wären es in der Büchertabelle keine user_id.
Also habe ich gerade das Ausländer -Plugin installiert und hinzugefügt und hinzugefügt "t.integer :user_id, :null => false"
und "add_foreign_key(:books, :users)"
in der Buchmigrationsdatei. Ich rannte "rake db:migrate"
, aber trotzdem gibt es mir die gleiche Ausnahme.
Ich verwende Rails 3 in Windows und entwickle, um den Benutzer zu authentifizieren.
Heimansicht
<p><%= link_to "Add new Book",:controller =>"book", :action => 'new' %></p>
<% @books.each do |b| %>
<p><%= b.author%></p>
<p><%= b.title%></p>
<%end%>
Home Controller
class HomeController < ApplicationController
def index
@user = current_user
@user.books||=Book.new
@books=@user.books
end
end
Buchcontroller
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
Erstellen Sie Tabellen-/Buchmigration
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
Buchansicht
<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"%>
Buchmodell
class Book < ActiveRecord::Base
belongs_to :user
end
Benutzermodell
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 Campus :: Application.Routes.Draw Holen Sie sich "Buch/Index"
get "book/edit"
get "book/new"
get "home/edit"
devise_for :users
resources :book
root :to=> "home#index"
match '/book/new' =>"home#index"
end
Datenbankschema
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
Lösung
Das user_id
Die Säule sollte nach dem Ausführen der Migration im Schema angezeigt werden. Es ist nicht in Ihrer Auflistung, also würde ich sagen, das ist das Problem. Vergewissere dich rake db:migrate
fällt ohne Fehler ab. Sie können die Migration mit wiederholen rake db:rollback && rake db:migrate
, im Bedarfsfall.