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