Używam Mongoid i mam 2 modele, Flow i Node z odniesieniem do relacji rodzic-dziecko.

class Node
  belongs_to :flow
end

class Flow
  has_many :nodes
end

Kiedy chcę usunąć węzeł z przepływem, robię to:

flow.nodes.clear

To niszczy powiązane węzły. Co zrobić, jeśli chcę usunąć powiązanie między węzłem a przepływem bez niszczenia powiązanych węzłów? Czy jest na to sposób?

1
picardo 24 lipiec 2011, 20:11
Flow belongs_to :flow literówka?
 – 
Dogbert
24 lipiec 2011, 20:19

2 odpowiedzi

Najlepsza odpowiedź

Powinieneś być w stanie użyć flow.nodes.clear, o ile nie masz ustawionego :dependent => :destroy. Z Przewodnika Rails na temat podstaw skojarzeń:

4.3.1.7 kolekcja.wyczyść

Metoda collection.clear usuwa każdy obiekt z kolekcji. To niszczy powiązane obiekty, jeśli są powiązane z :dependent => :destroy, usuwa je bezpośrednio z bazy danych if :dependent => :delete_all, i poza tym ustawia ich klucze obce na NULL.

Jeśli to nie działa, możesz spróbować tego i powinno to usunąć powiązanie:

flow.nodes = nil

EDYCJA 1

Jeśli nie, musisz utworzyć metodę ręcznego usuwania powiązania.

   flow.nodes.update_all :flow_id => nil
3
Matthew Lehner 24 lipiec 2011, 20:57
Collection.clear po prostu niszczy węzły, a ustawienie go na zero nie działa niestety z Mongoidem.
 – 
picardo
24 lipiec 2011, 20:42
Chyba trzeba będzie to zrobić ręcznie za pomocą update_all. Metoda Dogberta lub moja powinna to zrobić.
 – 
Matthew Lehner
24 lipiec 2011, 21:00

Nie wierzę, że istnieje jakakolwiek wbudowana metoda na to, ale możesz to zrobić:

Node.where(:flow_id => flow.id).update_all(:flow_id => nil)
1
Dogbert 24 lipiec 2011, 20:21