Spidy
Spidy

Reputation: 39992

Rails model can't access belongs_to model even though foreign key exists

I have a Model called Challenge that is created by a User. It has a Difficulty associated with it as well. When I create the Challenge and hand it the Author (User) and Difficulty, the Difficulty associate works, but the Author (User) one doesn't. The weirdest part is, when you look at the Challenge object, it shows the Author key its associated with.

challenge = Challenge.first
challenge.author (prints Nil) #Doesn't even run a Query

When I create a Challenge using the following code, the user_id is Nil.

user = User.find(1)
diff = Difficulty.find(1)
Challenge.create(:author => user, :difficulty => diff, :title => "My Challenge")

When I create a Challenge using this code, the User gets the relation to the Challenge and the Challenge gets the user_id of the User. But you can only go from User to Challenge. Challenge to User returns Nil.

user = User.find(1)
diff = Difficulty.find(1)
chall = Challenge.create(:difficulty => diff, :title => "My Challenge")
user.authored_challenges << chall

Here are my Models and Tables

# Models
class User < ActiveRecord::Base
  has_many :authored_challenges, :class_name => "Challenge"
  attr_accessible :display_name, :authored_challenges   
end

class Reward < ActiveRecord::Base
  has_many :challenges
  attr_accessible :name, :value, :challenges
end

class Challenge < ActiveRecord::Base
  belongs_to :reward
  belongs_to :author, :class_name => "User"
  attr_accessible :title, :description, :reward, :author
end

# Tables
create_table :users do |t|
  t.string :display_name
  t.timestamps
end

create_table :rewards do |t|
  t.string :name
  t.float :value
  t.timestamps
end

create_table :challenges do |t|
  t.integer :user_id
  t.integer :reward_id
  t.string :title
  t.string :description
  t.timestamps
end

Upvotes: 3

Views: 2596

Answers (2)

thatdankent
thatdankent

Reputation: 950

According to: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html the foreign key should be:

:foreign_key => :author_id

Don't forget to add the field. Good Luck!

Upvotes: 3

Kevin Bedell
Kevin Bedell

Reputation: 13404

Have you tried:

belongs_to :author, :class_name => "User", :foreign_key => :user_id

From the Rails documentation:

By convention, Rails assumes that the column used to hold the foreign key on this model is the name of the association with the suffix _id added. The :foreign_key option lets you set the name of the foreign key directly

The example given in the docs is very similar to the one you have:

class Order < ActiveRecord::Base
  belongs_to :customer, :class_name => "Patron", :foreign_key => "patron_id"
end

Upvotes: 1

Related Questions