rails将记录添加到has_many:通过连接表

时间:2016-04-26 19:14:55

标签: ruby-on-rails ruby jointable

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

我正在尝试在创建新事件时将:event_id和:team_id添加到EventTeam联接表中,尽管已经详尽地搜索了类似的问题,但似乎无法弄清楚如何:{{3} (我已尝试过所有这些建议)

似乎以下内容应该可行,但是会传递NoMethodError:&#34;未定义的方法`events&#39;对于#ActiveRecord :: Relation []&#34;

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

我在用户,团队和成员资格(联接表)的同一个应用程序中也有类似的情况。当用户创建新团队时,以下代码会自动将:team_id和:user_id添加到Memberships表。

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

有关如何完成此任务的任何建议?

2 个答案:

答案 0 :(得分:1)

  

未定义的方法`事件&#39;对于#ActiveRecord :: Relation []

where返回 AR关系 而不是 单一实例 ,因此{{1}不会工作。请改用@team.events

find

<强> 更新

  

找不到具有&#39; id&#39; =

的团队

您在@team = Team.find(params[:team_id]) @event = @team.events.create(event_params) 哈希中获得team_id,因此event无法正常工作。您需要使用params[:team_id]

params[:event][:team_id]

答案 1 :(得分:0)

只需指定关系的第一个值,因为您使用值id的唯一索引进行搜索,因此应该很好:

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

这是因为.wherefind_byfind(1)不同,返回Relation,而不是第一个值。

但是,在现代版本的rails中,我看到建议使用where.first对,而不是find