On Saturday 19 April 2008, Michael Schuerig wrote:
> Leider bin ich damit noch ein gutes Stück davon entfernt, diese
> Beziehungen auch bearbeiten zu können. Dabei ist das geringere
> Problem per Ajax oder purem JavaScript Formularelemente einzufügen
> und zu entfernen.

Für bestimmte Werte von "gelöst", habe ich das Problem inzwischen so 
gelöst:

Ich generiere zufällige Indizes, die allein dazu dienen, das Host-Select 
und die Target-Checkboxen einander zuzuordnen.

  <select 
    name="compiler[host_targets][120870757932348][host_id]">
    ...
  </select>

  <input type="checkbox"
    name="compiler[host_targets][120870757932348][target_ids][]" />

In der Compiler-Model-Klasse sieht das dann so aus:

  class Compiler < ActiveRecord::Base
    has_many :host_targets, :class_name => 'CompilerHostTarget',
      :dependent => :delete_all do
      def mappings
        self.inject(Hash.new { |h, k| h[k] = [] }) do |hash, mpg|
          hash[mpg.host_os] << mpg.guest_os
          hash
        end
      end
    end

    def host_targets=(host_targets_params)
      # Loesche *alle* bisherigen host-target-Kombinationen
      # fuer diesen Compiler
      host_targets.clear
      mappings = merge_host_target_mappings(host_targets_params)
      # Fuege alle jetzt gueltigen host-target-Kombinationen
      # fuer diesen Compiler ein
      mappings.each do |host_id, target_ids|
        target_ids.each do |gid|
          host_targets.build(:host_os_id => host_id,
            :target_os_id => gid)
        end
      end
    end

    private

    def merge_host_target_mappings(host_targets_params)
      host_targets_params.values.inject(Hash.new { |h, k| h[k] = [] }) 
do |hash, host_targets|
        host_id = host_targets[:host_id].to_i
        unless host_id == 0
          hash[host_id] |= 
Array(host_targets[:target_ids]).map(&:to_i).reject(&:zero?)
        end
        hash
      end
    end
  end

Das funktioniert so nur, weil die CompilerHostTarget-Objekte keine 
Identität unabhängig von ihrer eindeutigen Wertkombination haben, es 
sind reine Wertobjekte.

Nach wie vor würden mich Verbesserungsvorschläge interessieren.

Michael

-- 
Michael Schuerig
mailto:[EMAIL PROTECTED]
http://www.schuerig.de/michael/
_______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug

Antwort per Email an