I want one model for Player and one model for a Hit.
Any player has many hits against another player.
So from a Player I want to be able to get all the Hits, and from the
Hit get the hit Player.
On the other hand, from a Player I want to retrieve all Hits against
that player (were player_id = hits.hit_player_id)
and the player_id from that hit.
So far I have:
class Player < ActiveRecord::Base
has_many :hits
end
and
class Hit < ActiveRecord::Base
belongs_to :player
end
But I can't figure out how to map the 'hit' player.
class Hit < ActiveRecord::Base
belongs_to :hitter, :class_name => 'Player'
belongs_to :hittee, :class_name => 'Player'
end
Given a Player object, this is what you can do:
player.outgoing_hits # => list of hits by the player
player.incoming_hits # => list of hits to the player
player.hittees # => list of all players hit by this player
player.hitters # => list of all players hitting this player
You can switch the names around, but that's the idea.
I've set up the models as described above.
class Player < ActiveRecord::Base
has_many :outgoing_hits, :class_name => 'Hit', :foreign_key =>
'player_id'
has_many :incoming_hits, :class_name => 'Hit', :foreign_key =>
'hit_player_id'
class Tag < ActiveRecord::Base
belongs_to :hitter, :class_name => 'Player'
belongs_to :hittee, :class_name => 'Player'
end
For player foo, I'm trying to list all the name of all players hit.
<ul>
<% @player.outgoing_hits.each do |hit| %>
<li><%=hit.hittee.screen_name%></li>
<%end%>
</ul>
But, "hittee" is null, although I can access other properties of the
hit.
You have a nil object when you didn't expect it!
The error occurred while evaluating nil.screen_name
Here's the key columns of the 2 tables involved:
Player{
id:integer
screen_name:varchar
}
Your associations and table columns don't match. You have to tell
Rails how to map hitter and hittee if you are not following
convention. By default foreign key for a belongs_to association is the
name of the association with an "_id" suffix.
So if you want to follow convention, you change Hit-table to be like
this:
Hit {
id:integer
hitter_id:integer
hittee_id:integer
}
and change Player-class to use those column names (like in Matt Jones'
example).
Correcting the column names did the trick. Is there a similar
mechanism to the foreign-key hnit that can be used? I thought there
used to be an identified-by keyword?