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

まず、空白のスコアをゲームに拒否させます

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 に答える
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 に答える