Has_many with different foreign key


#1

Hello,

I am new to rails and am trying to get my associations straight. I
have a User model and a Property model. I’d like to track who has
updated a property record, so I added an integer field to the
properties table called updated_by. Then I made the following
changes:

In the User model:
has_many :properties

In the Property model:
belongs_to :user, :class_name => “User”, :foreign_key =>
‘updated_by’

Here’s what I see inside of the rails console:

prop = Property.first
=> #<Property id: 1, name: “Main Street Center”, …, updated_by: nil>

usr = User.first
=> #<User id: 1, login: “sshartles”, name: “Sam Shartles”, … >

prop.user = usr
=> #<User id: 1, login: “sshartles”, name: “Sam Shartles”, … >

prop.updated_by
=> 1

prop.updated_by.name
NoMethodError: undefined method `name’ for 1:Fixnum
from (irb):5

I’m not sure what I’ve done, but I think it’s something simple. Any
help would be massively appreciated.

Sam


#2

s. shartles wrote:

In the User model:
has_many :properties

In the Property model:
belongs_to :user, :class_name => “User”, :foreign_key =>
‘updated_by’

Here’s what I see inside of the rails console:

prop = Property.first
=> #<Property id: 1, name: “Main Street Center”, …, updated_by: nil>

usr = User.first
=> #<User id: 1, login: “sshartles”, name: “Sam Shartles”, … >

prop.user = usr
=> #<User id: 1, login: “sshartles”, name: “Sam Shartles”, … >

prop.updated_by
=> 1

prop.updated_by.name
NoMethodError: undefined method `name’ for 1:Fixnum
from (irb):5

Yeah the fixnum error is because updated_by is just an integer field to
rails.

If you tried:
prop.user = usr
prop.user.name #=> “Sam Shartles”

This should get you are trying to acheive:

In the User model:
has_many :properties, :foreign_key => ‘updated_by’

In the Property model:
belongs_to :updated_by, :class_name => ‘User’, :foreign_key =>
‘updated_by’

I must admit in the past I’ve tended to use ‘updated_by_id’ instead as
your field name that way you can access both updated_by_id (returns int)
and updated_by (returns user).

You may also look at the userstamp plugin:
http://github.com/delynn/userstamp/tree/master

Cheers
Luke