Für die Zwecke der Diskussion kochte ich einen Test mit zwei Tabellen auf:Entfernen eines der vielen doppelten Einträge in einer Beziehung-Beziehung?
:stones and :bowls (both created with just timestamps - trivial)
create_table :bowls_stones, :id => false do |t|
t.integer :bowl_id, :null => false
t.integer :stone_id, :null => false
end
Die Modelle sind ziemlich selbsterklärend und einfach, aber hier sind sie:
class Stone < ActiveRecord::Base
has_and_belongs_to_many :bowls
end
class Bowl < ActiveRecord::Base
has_and_belongs_to_many :stones
end
nun die Problem ist: Ich möchte, dass es in jeder Schale viele gleiche Steine gibt. Und ich möchte in der Lage sein, nur einen zu entfernen und die anderen identischen Steine zurückzulassen. Das scheint ziemlich einfach zu sein, und ich hoffe wirklich, dass ich beide eine Lösung finden kann und mich nicht wie ein Idiot fühle, wenn ich es tue.
Hier ist ein Testlauf:
@stone = Stone.new
@stone.save
@bowl = Bowl.new
@bowl.save
#test1 - .delete
5.times do
@bowl.stones << @stone
end
@bowl.stones.count
=> 5
@bowl.stones.delete(@stone)
@bowl.stones.count
=> 0
#removed them all!
#test2 - .delete_at
5.times do
@bowl.stones << @stone
end
@bowl.stones.count
=> 5
index = @bowl.stones.index(@stone)
@bowl.stones.delete_at(index)
@bowl.stones.count
=> 5
#not surprising, I guess... delete_at isn't part of habtm. Fails silently, though.
@bowl.stones.clear
#this is ridiculous, but... let's wipe it all out
5.times do
@bowl.stones << @stone
end
@bowl.stones.count
=> 5
ids = @bowl.stone_ids
index = ids.index(@stone.id)
ids.delete_at(index)
@bowl.stones.clear
ids.each do |id|
@bowl.stones << Stone.find(id)
end
@bowl.stones.count
=> 4
#Is this really the only way?
So ... ist das Ganze weggeblasen und es von Schlüssel wirklich der einzige Weg zu rekonstruieren?
Ich bin überzeugt! Ich wusste nicht, dass LIMIT nicht von DELETE unterstützt wurde (und war noch nicht verzweifelt genug, um in den SQL-Lorebooks zu graben). Vielen Dank! –