Forum: Ruby on Rails has_many with different foreign key

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
s. shartles (Guest)
on 2009-01-31 13:52
(Received via mailing list)
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
Luke P. (Guest)
on 2009-01-31 20:49
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
This topic is locked and can not be replied to.