ncarroll
ncarroll

Reputation: 118

rails add record to has_many :through join table

class EventTeam < ActiveRecord::Base
  belongs_to :event
  belongs_to :team
end

class Event < ActiveRecord::Base
  has_many :event_teams
  has_many :teams, through: :event_teams
end

class Team < ActiveRecord::Base
  has_many :event_teams
  has_many :events, through: :event_teams
end

I am trying to add the :event_id and :team_id to the EventTeam join table when creating a new Event and can't seem to figure out how, despite an exhaustive search of similar questions such as: how to add records to has_many :through association in rails (I've tried all of these suggestions)

It seems that the following should work, though a NoMethodError is delivered: "undefined method `events' for #ActiveRecord::Relation []"

EventsController

def new
  @event = Event.new(:team_id => params[:team_id])
end

def create
  @team = Team.where(:id => params[:team_id])
  @event = @team.events.create(event_params)
  if @event.save
    flash[:success] = "Event created!"
    redirect_to @event
  else  
    render 'new'
  end
end

I have a similar situation in the same app with Users, Teams, and Memberships (join table). The following code automatically adds the :team_id and :user_id to the Memberships table when a user creates a new Team.

TeamsController

def new
  @team = Team.new(:user_id => params[:user_id])
end

def create
  @team = current_user.teams.create(team_params)
  if @team.save
    flash[:success] = "Team created!"
    redirect_to @team
  else
    render 'new'
  end
end

Any suggestions on how to accomplish this?

Upvotes: 0

Views: 1785

Answers (2)

Pavan
Pavan

Reputation: 33542

undefined method `events' for #ActiveRecord::Relation []

where returns an AR relation not a single instance, so @team.events won't work. Use find instead

@team = Team.find(params[:team_id])
@event = @team.events.create(event_params)

Update

could not find Team with 'id'=

You are getting team_id inside event hash, so params[:team_id] won't work. You need to use params[:event][:team_id]

@team = Team.find(params[:event][:team_id])
@event = @team.events.create(event_params)

Upvotes: 1

Малъ Скрылевъ
Малъ Скрылевъ

Reputation: 16507

Just specify first value of the relation, since you are searching by unique index with value id, so that should be well:

@team = Team.where(id: params[:team_id]).first
@event = @team.events.create(event_params)

That is because .where, unlike find_by or find(1) returning a Relation, not a first value in it.

However, in modern version of rails I saw recommendation to use exactly where.first pair, not a find.

Upvotes: 0

Related Questions