has_many relationships - use variable of calling class?

Hi --

Hi all,

I'm having trouble issuing what I consider to be a simple one to many
relationship in rails. Here's some code:

def SoccerPlayer < ActiveRecord::Base
has_many :goal_list, :class_name => 'Goal', :foreign_key =>
'player_id', :conditions => 'player_name = #{last_name}'
end

This is a bit garbled. You need class, not def (def is for method
definitions), and the semantics are wrong: you don't (I assume) want a
player to have many goal *lists*, but to have one list which has many
*goals*.

Also, you're doing too much work. If you use a foreign key to
associate the goal with the player, then you don't also need to check
the last name -- and last names tend not to be unique anyway.

Basically, I want goal_list to be a list of all goals scored by this
player. However, accessing goal_list gives me the following error.

"undefined method `last_name' for Goal:Class"

So #{last_name} is referencing a Goal class, and not a SoccerPlayer
class. How do I get Rails to use the variable I want? Using
#{SoccerPlayer.last_name} doesn't work either ...

"undefined method 'last_name' for SoccerPlayer:Class" -- but I clearly
access this variable further below on the page.

Ideas?

I would start with this, and then tweak incrementally as necessary if
you want to change model or association names:

1. In the database, make sure the goals table has a soccer_player_id field.
2. In soccer_player.rb (the model file), do this:

   class SoccerPlayer < ActiveRecord::Base
     has_many :goals
   end

3. In goal.rb, do this:

   class Goal < ActiveRecord::Base
     belongs_to :soccer_player
   end

4. Now, when a goal is scored, in your controller you would do this
(assuming that @player is the scorer and @goal is the goal):

   @player.goals << @goal

David

>
> def SoccerPlayer < ActiveRecord::Base
> has_many :goal_list, :class_name => 'Goal', :foreign_key =>
> 'player_id', :conditions => 'player_name = #{last_name}'
> end

This is a bit garbled. You need class, not def (def is for method
definitions), and the semantics are wrong: you don't (I assume) want a
player to have many goal *lists*, but to have one list which has many
*goals*.

Also, you're doing too much work. If you use a foreign key to
associate the goal with the player, then you don't also need to check
the last name -- and last names tend not to be unique anyway.

Just for OP's reference, the :conditions parameter is useful for doing
things like :conditions=>'deleted = true' or similar, not to model the
relationship itself, AR should take care of that.

Max