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?
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?
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.
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?
[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
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
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.
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.