rails 4 - 使用has_and_belongs_to_many关联

时间:2014-05-22 00:52:12

标签: ruby-on-rails ruby ruby-on-rails-4

我有两种类型的数据:TeamGame。一个团队可以属于多个游戏(例如,大学可以玩篮球,足球和足球),每个游戏自然有很多团队在联盟中发挥。

class Game < ActiveRecord::Base
  has_and_belongs_to_many :teams
end

class Team < ActiveRecord::Base
  has_and_belongs_to_many :games
end

db中有一个表,其中有两列用于保存这些关系:

create_table "games_teams", id: false, force: true do |t|
  t.integer "game_id"
  t.integer "team_id"
end

到目前为止一切顺利。

我需要构建一个表单来添加新的Teams,但我无法正确显示Game

<%= form_for @team, :html => {:class => 'form-horizontal form', :role => 'form'} do |f| %>
  <%= f.collection_select(:game_id, Game.all, :id, :name) %>

这会引发错误undefined method game_id for #<Team:0x007fa1af68f2d8>

如何在使用game_id对象时正确插入Team,在添加team_id时如何Game?我意识到这些应该处理一个“多选”场景,但目前我无法让它工作。

谢谢!

4 个答案:

答案 0 :(得分:1)

您正在寻找的答案是使用game_ids[]代替:

#View
<%= f.collection_select(:game_ids, Game.all, :id, :name) %>

#Controller
def create
   @team = Team.new(Team_params)
   @team.save
end

private

def team_params
    params.require(:team).permit(game_ids: [])
end

这应该设置has_and_belongs_to_many数据的集合值。当我进入办公室时,我必须对此进行测试 - 这肯定有效,但语法是否正确是我必须找到的

答案 1 :(得分:0)

collection_select上的第一个参数是来自已描述对象的属性。那么,这一行

f.collection_select(:game_id,Game.all,:id,:name)

尝试在失败的对象game_id上调用team

我不确定rails是否支持直接方法来帮助您构建此关联。您始终可以使用select_tagoptions_for_select构建解决方案(mutiple: true,因为它是has_and_belongs_to_many,会向您的操作发送一系列game_id并手动处理。< / p>

您还可以查看此rails cast

答案 2 :(得分:-1)

尝试使用association而不是collection_select

<%= form_for @team, :html => {:class => 'form-horizontal form', :role => 'form'} do |f| %>
    <%= f.association :game, collection: Game.all.map{|p| [p.id, p.name]}, :label => 'Drive', :prompt => "Select Game" %>

答案 3 :(得分:-2)

我相信你想使用has_many而不是has_and_belongs_to_many。像:

class Game < ActiveRecord::Base
  has_many :game_teams
  has_many :teams, :through => :game_teams
end

class Team < ActiveRecord::Base
  has_many :game_teams
  has_many :games, :through => :game_teams
end