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