Updating zusätzliche Attribute in einem has_many,: durch Beziehung mit Rails
Ich habe es geschafft, eine Viele-zu-Viele-Beziehung zwischen den folgenden Modellen aufzubauen.
ZeicheKompetenze PlayerSkillsPlayerSkills hat im Moment ein Attribut, das Skills normalerweise nicht haben: ein Level.
Die Modelle sehen ungefähr so aus (aus Gründen der Übersichtlichkeit bearbeitet):
class PlayerSkill < ActiveRecord::Base
belongs_to :character
belongs_to :skill
end
class Skill < ActiveRecord::Base
has_many :player_skills
has_many :characters, :through => :player_skills
attr_accessible :name, :description
end
class Character < ActiveRecord::Base
belongs_to :user
has_many :player_skills
has_many :skills, :through => :player_skills
end
Also nichts Besonderes an den Modellen ... Der Controller ist zu diesem Zeitpunkt auch sehr einfach ... es handelt sich so ziemlich um eine Lageraktualisierungsaktion.
Das Formular, das ich ändern möchte, ist Zeichen # bearbeiten. Momentan werden eine Reihe von Kontrollkästchen angezeigt, mit denen den Charakteren Fähigkeiten hinzugefügt bzw. von ihnen entfernt werden. Das ist großartig, aber der springende Punkt bei der Verwendung von has_many: through war, auch ein "Level" zu verfolgen.
Hier ist was ich bisher habe:
- form_for @character do |f|
= f.error_messages
%p
= f.label :name
%br
= f.text_field :name
%p
= f.label :race
%br
= f.text_field :race
%p
= f.label :char_class
%br
= f.text_field :char_class
%p
- @skills.each do |skill|
= check_box_tag "character[skill_ids][]", skill.id, @character.skills.include?(skill)
=h skill.name
%br
%p
= f.submit
Nach dem Rendern von "skill.name" muss ein Textfeld gedruckt werden, das player_skill aktualisiert.
Das Problem ist natürlich, dass player_skill existieren kann oder nicht! (Abhängig davon, ob das Kästchen beim Laden des Formulars bereits angekreuzt war!)
Von allem, was ich gelesen habe, ist has_many: through großartig, da Sie die Beziehung selbst als Entität behandeln können ... aber ich bin völlig ratlos, wie mit der Entität in dieser Form umgegangen werden soll.
Wie immer, vielen Dank im Voraus für jede Hilfe, die Sie mir geben können!