Problem z asocjacją

Witam, mam problem ze stworzeniem pewnej zależności.

Strona składa się z Boxów, każdy box może mieć 1 moduł, natomiast jeden moduł może być w wielu boxach.

Próbowałem to zrobić w ten sposób:

class Box < ActiveRecord::Base has_one :site_module, :through => :box_module_connection end

class SiteModule < ActiveRecord::Base has_many :boxes, :through => :box_module_connections end

class BoxModuleConnection < ActiveRecord::Base belongs_to :boxes belongs_to :site_modules end
Otrzymuje jednak błąd “Could not find the association :box_module_connection in model Box”

W jaki sposób mogę rozwiązać taką asocjacje 1 do wielu?

W Box i SiteModule brakuje definicji asocjacni box_module_connections:

dopisz w Box

has_one :box_module_connection

a w SiteModule

has_many :box_module_connections

Hmmm… Coś się zmieniło jednak mam nowy błąd i mimo kombinowania nie mam pojęcia co z nim zrobić.

Otrzymuje go po wywołaniu box.site_module

Could not find the source association(s) :site_module or :site_module in model BoxModuleConnection. Try 'has_many :site_module, :through => :box_module_connection, :source => <name>'. Is it one of :site_modules or :boxes?

Tak mi się wydaje:

[code]class Box < ActiveRecord::Base
has_many :box_module_connections
has_one :site_module, :through => :box_module_connections
end

class SiteModule < ActiveRecord::Base
has_many :box_module_connections
has_many :boxes, :through => :box_module_connections
end

class BoxModuleConnection < ActiveRecord::Base
belongs_to :box
belongs_to :site_module
end[/code]
Zwróć uwagę na końcówki. Gdzie jest liczba mnoga a gdzie nie ma.

Dzięki wielkie, działa jak należy :slight_smile:

Mam jeszcze jedno pytanie związane z tą asocjacją.

Mam połączony Box z StieModule, więc mam w tabeli box_module_connections rekord typu:
id_box: 10, id_module: 13

I teraz chcę aby w momencie gdy usunę box, skasowało się to powiązanie z box_module_connections, ale żeby SiteModule pozostał bez zmian.

Na logikę zrobiłem to tak:

[code]class Box < ActiveRecord::Base
has_one :box_module_connection, :dependent => :destroy
has_one :site_module, :through => :box_module_connection

end[/code]
Czyli dodałem dependent => :destroy, więc po skasowaniu boxa, powinno chyba również skasować odpowiednie powiązanie, gdzie tkwi błąd w moim rozumowaniu?

:dependent => :destroy wywal z modelu box
i daj go do modelu box_module_connections

Dalej żadnego rezultatu

[quote=czACha]:dependent => :destroy wywal z modelu box
i daj go do modelu box_module_connections[/quote]
Co? Wtedy przy usunięciu powiązania usunie się Box/SiteModule.

Sevin, Twoje rozwiązanie wygląda dobrze… Pomimo tego BoxModuleConnection nie jest usuwane?

No właśnie tak mi się wydawało, że dobrze rozumuje, pokaże więc dokładniej jak to wygląda, może jakiś mały szczegół tu wszystko psuje.

class Box < ActiveRecord::Base has_one :box_module_connection, :dependent => :destroy has_one :site_module, :through => :box_module_connection end

class SiteModule < ActiveRecord::Base has_many :box_module_connections has_many :boxes, :through => :box_module_connections end

class BoxModuleConnection < ActiveRecord::Base belongs_to :box belongs_to :site_module end
I jakby co tabela box_module_connections ma pola: id, box_id, site_module_id

pokaz tabele, może tam czegos brakuje

Nie wiem co może być źle w tabelach. W ‘boxes’ i ‘site_modules’ jest oczywiście id oraz inne pola, a w ‘box_module_connections’ pola: id, box_id, site_module_id

http://guides.rubyonrails.org/association_basics.html to sobie przeczytaj, może rozjaśni.

Pytanie o pomoc na forum zawsze traktuje jako ostateczność, gdy po przeszukaniu forum, googla, książki i metodzie prób i błędów nic nie mogę zdziałać. Tekst z powyższego linka również czytałem, jednak nic mi to nie pomogło.

Według tego:

4.2.2.5 :dependent

If you set the :dependent option to :destroy, then deleting this object will call the destroy method on the associated object to delete that object. If you set the :dependent option to :delete, then deleting this object will delete the associated object without calling its destroy method. If you set the :dependent option to :nullify, then deleting this object will set the foreign key in the association object to NULL.

Po dodaniu:

 has_one :box_module_connection, :dependent => :destroy

Powinno wg mojego rozumowania usunąć powiązany z tym boxem rekord z box_module_connection. Chyba, że nie mogę w ten sposób usunąć rekordu wiążącego i musze zrobić to ręcznie? Nie jest problem to obejść, ale ciekawi mnie w czym tkwi błąd.

Pozdrawiam