Team captain - habtm w/has_one

the below…

class User < ActiveRecord::Base
has_and_belongs_to_many :teams

class Team < ActiveRecord::Base
has_and_belongs_to_many :users
has_one :captain, :class_name => ‘User’

produces the error…

Mysql::Error: Unknown column ‘users.team_id’ in ‘where clause’: SELECT *
FROM users WHERE (users.team_id = 1) LIMIT 1

i realize the error - and my current solution is to add user_id to
team…

then i have…

class Team < ActiveRecord::Base
has_and_belongs_to_many :users

def captain
User.find(user_id)
end

although the above solution seems awkward - is there a better way to
accomplish the above?

class User < ActiveRecord::Base
has_many :memberships
has_many :teams, :through => :memberships

class Team < ActiveRecord::Base
has_many :memberships
has_many :users, :through => :memberships
has_one :captain, :class_name => ‘User’, :conditions =>
[‘memberships.captain = ?’, true], :through => :memberships
end

class Membership < ActiveRecord::Base
end

I haven’t run this, but it looks nice.

Your memberships table would need a boolean ‘captain’ field, which is
set to true for the user,club combination as appropriate

Dr Nic wrote:

Your memberships table would need a boolean ‘captain’ field, which is
set to true for the user,club combination as appropriate

is memberships similar to teams_users?

last question…

so i still have a problem with select boxes and the controller…

class Team < ActiveRecord::Base
has_many :memberships
has_many :users, :through => :memberships

class User < ActiveRecord::Base
has_many :memberships
has_many :teams, :through => :memberships

class Membership < ActiveRecord::Base
belongs_to :user
belongs_to :team

def create
@team = Team.new(params[:team])

NoMethodError in TeamController#create

undefined method `user_ids=’ for #Team:0x2789500

so i looked - user_ids isn’t there - just membership_ids…

Michael B. wrote:

Dr Nic wrote:

Your memberships table would need a boolean ‘captain’ field, which is
set to true for the user,club combination as appropriate

is memberships similar to teams_users?

Yep. Same columns (plus the captain column), with a better name.

i solved the above using the below…

def create
@team = Team.new(params[:team])
if @team.save
flash[:notice] = ‘Team was successfully created.’

Membership.new(:user => @session['user'], :team => @team, 

:is_the_captain => true).save

User.find(params[:membership][:user_ids]).each do |user|
  Membership.new(:user => user, :team => @team).save
end

still seems strange…

thoughts/comments?

User.find(params[:membership][:user_ids]).each do |user|
  Membership.new(:user => user, :team => @team).save
end

I don’t get why you’re doing this. If you’re creating a new Team, then
the creator will be the first and only member at that time.

what if they don’t select their-self?

here is the view…

<% @selected = @team.users.collect { |v| v.id.to_i } %>

<%= options_from_collection_for_select(@users, “id”, “login”,
@selected) %>

and the db…

create table memberships (
id int(10) unsigned not null auto_increment,
team_id int(10) unsigned not null,
user_id int(10) unsigned not null,
is_the_captain tinyint(1) not null default ‘0’,
primary key (id),
unique (team_id, user_id),
foreign key (team_id) references teams(id),
foreign key (user_id) references users(id)
) engine=innodb default charset=latin1;

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs