在我的 RoR 中,我有一张桌子games
,stats
和players
。每场比赛都有很多players,
每个玩家都有很多“统计数据”,每场比赛都有很多stats
通过players.
我想要做的是在我的编辑游戏表格中,我希望有一行字段来添加一个新的统计数据行,游戏中每个玩家都有一个。我已经阅读了很多关于 nested_attributes 的内容,但发现了如何完全做到这一点的新的好资源。
2 回答
更新:这是基于您在评论中陈述的新关联的一组更新的类
# models/game.rb
class Game < ActiveRecord::Base
has_many :teams
accepts_nested_attributes_for :teams
attr_accessible :name, :teams_attributes
end
# models/team.rb
class Team < ActiveRecord::Base
belongs_to :game
has_many :players
accepts_nested_attributes_for :players
attr_accessible :name, :players_attributes
end
# models/player.rb
class Player < ActiveRecord::Base
belongs_to :team
has_many :stats
accepts_nested_attributes_for :stats, reject_if: proc { |attributes| attributes['name'].blank? }
attr_accessible :name, :stats_attributes
end
# models/stat.rb
class Stat < ActiveRecord::Base
belongs_to :player
attr_accessible :name
end
# controllers/games_controller.rb
class GamesController < ApplicationController
def edit
@game = Game.find(params[:id])
@game.teams.each do |team|
team.players.each do |player|
player.stats.build
end
end
end
def update
@game = Game.find(params[:id])
if @game.update_attributes(params[:game])
render "show"
else
render text: "epic fail"
end
end
end
# games/edit.html.erb
<%= form_for @game do |f| %>
<%= f.fields_for :teams do |tf| %>
<p>Team: <%= tf.object.name %></p>
<%= tf.fields_for :players do |pf| %>
<p>Player: <%= pf.object.name %></p>
<%= pf.fields_for :stats do |sf| %>
<%= sf.text_field :name %>
<% end %>
<% end %>
<% end %>
<%= f.submit %>
<% end %>
请注意,这不会做任何类型的 ajax“添加另一个统计”或任何花哨的东西。它只是在最后为每个玩家添加一个额外的空白字段。如果您需要更多,您可以在GamesController#edit
操作中构建更多空白统计对象或实现一些花哨的裤子 javascript。希望这将使您足够接近,以便能够使您的真实数据正常工作。
http://railscasts.com/episodes/196-nested-model-form-part-1
http://railscasts.com/episodes/197-nested-model-form-part-2
没有看到更多您自己的代码,我无法具体说明,但基本上,您循环所有玩家并“构建”统计数据... game.players.each {|p| p.build_stat} 然后在表单中,再次循环遍历所有玩家,并显示统计信息(可能仅限于 new_record?那些?)或者也许在表单中正确构建,因此它显示一个空白条目。
我想我看到了一个潜在的问题,你的模型......如果统计数据是特定游戏的特定表示,那么你描述的模型不会链接它们 - 你需要一个 game_id 和 player_id 在每个统计记录。如果是这种情况,您将在控制器方法中构建所有统计信息,并在视图中循环它们。