I am building an application in Ruby on Rails and I am including 3 of my models (and their migration scripts) to show what I am trying to do and what is not working. Here's a summary: I have users in my application that belong to teams, and each team can have several coaches. I want to get a list of trainers that are applicable to the user.
For example, User A may belong to T1 and T2. Teams T1 and T2 can have four different coaches, and one coach together. I would like to get a list of trainers simply by saying:
u = User.find(1) coaches = u.coaches
Here are my migration scenarios and associations in my models. Am I doing something wrong in my design? Are my associations correct?
class CreateUsers < ActiveRecord::Migration def self.up create_table :users do |t| t.column :login, :string, :default => nil t.column :firstname, :string, :default => nil t.column :lastname, :string, :default => nil t.column :password, :string, :default => nil t.column :security_token, :string, :default => nil t.column :token_expires, :datetime, :default => nil t.column :legacy_password, :string, :default => nil end end def self.down drop_table :users end end class CreateTeams < ActiveRecord::Migration def self.up create_table :teams do |t| t.column :name, :string end end def self.down drop_table :teams end end class TeamsUsers < ActiveRecord::Migration def self.up create_table :teams_users, :id => false do |t| t.column :team_id, :integer t.column :user_id, :integer t.column :joined_date, :datetime end end def self.down drop_table :teams_users end end
Here are the models (not the whole file):
class User < ActiveRecord::Base has_and_belongs_to_many :teams has_many :coaches, :through => :teams class Team < ActiveRecord::Base has_many :coaches has_and_belongs_to_many :users class Coach < ActiveRecord::Base belongs_to :teams end
Here's what happens when I try to pull the trainers out:
u = User.find(1) => #<User id: 1, firstname: "Dan", lastname: "Wolchonok"> >> u.coaches ActiveRecord::StatementInvalid: Mysql::Error: #42S22Unknown column 'teams.user_id' in 'where clause': SELECT `coaches`.* FROM `coaches` INNER JOIN teams ON coaches.team_id = teams.id WHERE ((`teams`.user_id = 1))
Here's the error in sql:
Mysql :: Error: # 42S22Unknown column 'teams.user_id' in 'where clause': SELECT coaches . * FROM coaches INNER JOIN teams ON coaches.team_id = teams.id WHERE (( teams . User_id = 1))
I missed something in my: through the proposal? Is my design completely off? Can someone point me in the right direction?