1

私は格闘技関連のデータベースを構築しています。現在、次の関連付けを設定しています。

  • 学生 has_and_belongs_to_many :styles
  • スタイル has_many :ranks
  • Student has_many :ranks, through: :gradings (およびその逆)

学生のスタイルに応じて、次のようにフォームを生成しています。

採点フォーム

そのため、見出しはStyleモデル (太極拳、空手など) によって生成され、次に (モデルから取得した) 以下にリストされているランキングが生成され、「Dojo」フィールドと「Date」フィールドは、作成されたモデルRankに属する必要があります。Grading

質問: 1 つの関連付け (または 1 つの関連付け + その子) を作成するフォームを作成する方法は知っていますが、一度に複数の関連付けを作成するフォームを作成するにはどうすればよいですか?

また、以下を実装するためのクリーンな方法は何でしょうか。

  1. チェックされている行のみが関連付けられます
  2. Dojo と日付は、チェックされた行が正常に保存されるように入力する必要があります
  3. 行のチェックを外すと、以前に作成された関連付けが破棄されます

これは、正しいレコードを取得するために現在実装しているものです。

class GradingsController < ApplicationController
  before_filter :authenticate_sensei!

  def index
    @student = Student.includes(:styles).find(params[:student_id])
    @ranks = Rank.for_student_styles(@student)
    split_ranks_by_style
  end

  private

  def split_ranks_by_style
    @karate = @ranks.select_style("Karate")
    @tai_chi = @ranks.select_style("Tai Chi")
    @weaponry = @ranks.select_style("Weaponry")
  end
end

# Rank model
def self.for_student_styles(student)
  includes(:style).where("styles.id in (?)", student.styles.map(&:id))
end

def self.select_style(style)
  all.map { |r| r if r.style.name == style }.compact
end
4

1 に答える 1