私は格闘技関連のデータベースを構築しています。現在、次の関連付けを設定しています。
- 学生 has_and_belongs_to_many :styles
- スタイル has_many :ranks
- Student has_many :ranks, through: :gradings (およびその逆)
学生のスタイルに応じて、次のようにフォームを生成しています。
そのため、見出しはStyle
モデル (太極拳、空手など) によって生成され、次に (モデルから取得した) 以下にリストされているランキングが生成され、「Dojo」フィールドと「Date」フィールドは、作成されたモデルRank
に属する必要があります。Grading
質問: 1 つの関連付け (または 1 つの関連付け + その子) を作成するフォームを作成する方法は知っていますが、一度に複数の関連付けを作成するフォームを作成するにはどうすればよいですか?
また、以下を実装するためのクリーンな方法は何でしょうか。
- チェックされている行のみが関連付けられます
- Dojo と日付は、チェックされた行が正常に保存されるように入力する必要があります
- 行のチェックを外すと、以前に作成された関連付けが破棄されます
これは、正しいレコードを取得するために現在実装しているものです。
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