使用accepts_nested_attributes_for在表单中显示固定数量的子项

时间:2012-06-11 04:45:37

标签: ruby-on-rails ruby ruby-on-rails-3

在表单中,我需要在has_many集合中显示固定数量的模型,无论它们是否存在。例如:

假设有一个游戏,可以输入10个分数。但并非所有人都需要输入 - 你可以输入0到10之间的任何地方。但是表格仍然总是显示10个分数输入。

这是我实施它的方式:

class Game < ActiveRecord
  has_many :scores
  accepts_nested_attributes_for :scores

  alias :scores, :original_scores

  def scores
    return original_scores if caller[0] =~ /.*fields_for.*/
    scores_to_display = original_scores # could be anywhere from 0 to 10
    # fill out the array up to 10
    return scores_to_diplay
  end
end

这很难看,因为我基本上覆盖了应该由has_many返回的ActiveRecord :: Relation对象 - 这就是为什么如果调用者不是表单助手我返回original_scores,否则会打破删除和其他关联方法。我不确定如何做得更清洁。有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

你可以从这样的空数组开始:

scores = Array.new(11,0)  # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

然后用可用分数填写。

这在概念上类似于在SQL中使用“左外连接”或在原始分数上执行查找,然后include当前分数也使用左外连接。

答案 1 :(得分:0)

首先,让游戏拒绝任何空白的分数

class Game < ActiveRecord
  has_many :scores
  accepts_nested_attributes_for :scores, :reject_if => :all_blank
end

然后,在您的控制器中,构建10个分数以在表单上显示

class GamesController < ApplicationController

  def new
    @game = Game.new
    10.times { @game.scores.build }
  end
end