0

在表单中,我需要在 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 ,否则这会破坏删除和其他关联方法。我不确定如何更清洁。有什么想法吗?

谢谢!

4

2 回答 2

0

你可以像这样从一个空数组开始:

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

然后用可用的分数填充它。

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

于 2012-06-11T04:51:09.040 回答
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
于 2012-06-11T13:10:05.077 回答