我有两种类型的数据:Team
和Game
。一个团队可以属于多个游戏(例如,大学可以玩篮球,足球和足球),每个游戏自然有很多团队在联盟中发挥。
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
?我意识到这些应该处理一个“多选”场景,但目前我无法让它工作。
谢谢!
答案 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_tag
和options_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