Reputation: 613
I cant seem to figure out why I keep getting this error. I am trying to add comment forms to a blog I am making and it wont work. Here is what the full error says.
ActiveRecord::StatementInvalid in Posts#show
Showing /Users/ipbyrne/FirstRailsApp/blog/app/views/posts/show.html.erb where line #17 raised:
PG::UndefinedColumn: ERROR: column comments.post_id does not exist LINE 1: SELECT COUNT() FROM "comments" WHERE "comments"."post_id" ... ^ : SELECT COUNT() FROM "comments" WHERE "comments"."post_id" = $1
</p>
<div id="comments">
<h2><%= @post.comments.count %> Comments</h2> <-- Says it breaks here
<%= render @post.comments %>
<h3>Add a comment:</h3>
From what i can understand there is a column missing in one of the tables in the schema.rb file? Incase this the case here is what mine looks like
# encoding: UTF-8
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20140911230918) do
create_table "comments", force: true do |t|
t.string "name"
t.text "body"
t.integer "post_id"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "comments", ["post_id"], name: "index_comments_on_post_id"
create_table "posts", force: true do |t|
t.string "title"
t.text "body"
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", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
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"
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
end
Upvotes: 5
Views: 16397
Reputation: 1540
You probably just need to add the column into your comments
table.
You can do that by creating a migration via the terminal to add the column in:
$ rails g migration add_post_id_column_to_comments post:belongs_to
$ rake db:migrate
The reason you want to use post:belongs_to
is that Rails will automatically append the _id
suffix and create a foreign key in the comments table to refer back to each other.
So essentially this part of the migration post:belongs_to
will add the column post_id
to your comments table. (Same thing if you did for example cars:belongs_to
, you would get cars_id
, etc)
That way you can be able to refer to the post's comments like this:
@post.comments
The reason why your @post.comments
is failing now is that it is looking for that post_id
column that you have not made yet which is probably also because you may not have defined the relationship between your Post
and Comment
models.
If you haven't done so already you just need to quickly define the relationship in each model:
belongs to
a post.Get the lingo?
In your Post
model, just add
class Post < ActiveRecord::Base
has_many :comments # make sure it's pluralized
end
and in your Comment
model, add
class Comment < ActiveRecord::Base
belongs_to :post # and this one is singularized
end
Then try running your app again. Let me know how it goes.
Upvotes: 5
Reputation: 3842
Yes, you're missing the field post_id
on the Comment
model, which would tell Rails which comments belong to which posts.
You can add it by generating a migration from the command line like so:
rails generate migration AddPostIdToComments post:references
rake db:migrate
Upvotes: 1