Grantismo
Grantismo

Reputation: 3819

Objects and Relations in Ruby on Rails

I'm attempting to create a simple web application for some personal development, but I've run into an obstacle, which I'm hoping others will find trivial. I have working classes created, but I'm not sure how define their relationships, or whether their models are even appropriate.

For the sake of argument, I have the following classes already in existence: User, Team, and Athlete

The functionality I'm striving for is for a user to create a team by adding one athlete to the team object. Other users can either add players to the team, or they can add alternatives to an existing athlete on the team roster. Essentially, I want to create some sort of class to wrap an array of athlete objects, we'll call it AthleteArray.

If my understanding is correct, these are the relationships that would be appropriate:

  1. So a Team would have-many AthleteArrays
  2. An AthleteArray would have-many Athletes and would belong-to a Team
  3. Athletes would belong-to a User, and would belong-to a AthleteArray.
  4. Users would have-many athletes, but that would be the extent of their involvement.

Since the AthleteArray class wouldn't have any attributes, is it wise to create it as an ActiveRecord object(would it merely have an ID)? Is there another way to implement this idea(can you define the team class, to have an array of arrays of athlete objects)? I have very little knowledge of RoR, but I thought it would be a good place to start with web development. Any help would be appreciated. Thanks in advance!

Edit: The names of Athletes, Teams, and AthleteArrays are unimportant. Assume that an Athlete is basically a comment, validated against a list of athletes. Duplication is acceptable. If I'm understanding the answers posted, I should basically create an intermediate class which takes the IDs of their parents?

Is response to Omar: Eventually, I'd like to add a voting system. So after basic team is created, users can individual suggest replacements for a given player, and users can vote up the best choices. For instance, If I have a team of chess_players created:

  1. Bobby Fischer
  2. Garry Kasparov
  3. Vladimir Kramnik

someone might click on Kasparov, and decide that a better athlete would be Deep Blue, so this option would appear nested under Kasparov until it received more votes. This same process would occur for every character, but unlike a comment system, you wouldn't be able to respond to "Deep Blue" and substitute another player, you would simply respond to the position number 2, and suggest another player.

Upvotes: 0

Views: 425

Answers (2)

Omar Qureshi
Omar Qureshi

Reputation: 9093

Right, so if I understand the question properly, there will be many possible combinations of athletes for a team, which may or may not use the same athletes?

Something sounds off here, possibly in the naming of your models. Don't quite like the smell of AthleteArrays.

has_many_through might be what you need to access the athletes from your team e.g.

has_many :athletes, :through => :team_permuations # your AthleteArray model

Josh Susser has an old roundup of many to many associations which i guess is what you need, since according to your specification, theoretically it can be possible for an athlete to belong to any number of teams. I suppose the best thing is that you can have automagically populated audit columns (created/updated_at/on) on your many to many associations, which is a nice thing to have.

http://blog.hasmanythrough.com/2006/4/20/many-to-many-dance-off

Please comment if you think I have understood the question wrong.

Upvotes: 1

Ben Hughes
Ben Hughes

Reputation: 14195

If I understand your need, this is something that can be solved through has_many :through.

basically you can represent this in the database like

athletes:
  id
  other_fields

teams:
  id
  other_fields

roster_items:
  id
  team_id
  athlete_id
  position
  is_active #is currently on the team or just a suggestion
  adding_user_id #the user who added this roster item

class Athlete < ActiveRecord::Base
  has_many :roster_items
end

class Team < ActiveRecord::Base
  has_many :roster_items
  has_many :athletes, :through => :roster_items
end

class RosterItem < ActiveRecord::Base
  belongs_to :team
  belongs_to :athlete
  belongs_to :adding_user, :class_name => 'User'
end

Upvotes: 1

Related Questions