I am getting the following error when I try to access one of my pages
ActiveRecord::StatementInvalid (Mysql2::Error: Table 'p478r679_partybot.secretsanta' doesn't exist: SHOW FIELDS FROM 'secretsanta'): app/controllers/secretsantas_controller.rb:7:in `index'
But this table exists in my DB.
Just to give you a background of my problem, I wrote this application few years ago and it was working fine up until recently. When I tried to start the application with thin server, I got the following error
You have already activated rack 1.4.3, but your Gemfile requires rack 1.2.1. Using bundle exec may solve this. (Gem::LoadError)
So I approached the tech support from my hosting service for assistance. They said,
“The problem was that the rails version was not compatible with the bundler version. Now we have changed the rails version to "3.1.10" and have installed the bundler "1.2.3 ". Now your website is loading fine.The "thin" service is started in your server. The port is listening to the application. Refer the details given below.”
And they have updated all my gems for get it working. I was originally using Rails 3.0.1 and thin 1.2.7. Now I have Rails 3.1.10 and thin 1.5.1. Now the application is loading, and all the features working, except Secretsanta.
When I look at the following part of the error message closely, “SHOW FIELDS FROM secretsanta” I see the table name is “secretsanta”, should it be “secretsantas”?
I am not sure what to make of this, after all the application was working fine for the past 3 years and I am not sure why it not working after updating the gems
Here is some code snip of Secretsanta model User model and SecretsantasController.
Secretsanta.rb
class Secretsanta < ActiveRecord::Base
belongs_to :user
belongs_to :gift_receiver, :class_name => "User"
...
User.rb
class User < ActiveRecord::Base
# Setup accessible (or protected) attributes for your model
attr_accessible :first_name, :last_name, :email,
:password, :password_confirmation, :remember_me
validates :first_name, :presence => true
validates :last_name, :presence => true
validate :should_be_invited
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable, :lockable and :timeoutable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_one :potluck
has_one :secretsanta
has_one :gift_receiver, :through => :secretsanta
has_many :secretsantaExclutions
has_many :excluded, :through => :secretsantaExclutions
has_many :discussions
has_many :comments
...
secretsantas_controller.rb
class SecretsantasController < ApplicationController
before_filter :authenticate_user!
def index
@exclutionList = SecretsantaExclution.find_all_by_user_id(current_user.id)
@event = Event.find_by_id(4)
@rsvp = GuestList.find_by_guest(current_user.email)
@secretsanta = Secretsanta.find_by_user_id(current_user.id) #i am getting the error at this line
end
Please let me know if you need and additional information. Thanks for your help in advance
I believe you were right on in your suspicion about the secretsanta table name.
Unless you've set a table_name on your secretsanta model, rails will look for a table named secretsantas
. If the application was working before, I'd guess that the table actually is named secretsantas
.
To list the available tables, run:
tables = ActiveRecord::Base.connection.tables
Ah, here's the problem:
'Secretsanta'.pluralize
=> "Secretsanta"
Try specifying the table name in your model:
class Secretsanta < ActiveRecord::Base
self.table_name = "secretsantas"
end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With