Powiązanie tabeli ze sobą przez tabelę zewnętrzną

Cześć, mam w uproszczeniu takie tabele/modele:

  • jwl_products id:integer name:string
  • jwl_products_parts product_id:integer subproduct_id:integer

I w jwl_products mogę mieć:
1 | Kamyczek jakiś
2 | Kamyczek inny
3 | Żyłka
4 | Zapinka
5 | Gotowy łańcuszek jakiś
6 | Gotowy łańcuszek inny

A w jwl_products_part mam połączone kamyczki (1), zapinki (4) i żyłki (3) w gotowy łańcuszek (5) czyli:
5 | 1
5 | 3
5 | 4
6 | 2
6 | 3
6 | 4

Na liście produktów chcę mieć wszystko, bo mogę sprzedawać równocześnie pojedyncze elementy/składniki jak i gotowe produkty.

Mam problem z wyświetleniem listy produktów (1, 3, 4), z których składa się produkt (5) na jego odsłonie.

Jakie relacje powinny być zdefiniowane w modelach? Było już dużo prób… i wciąż dostaję błędy :frowning:

jest wzorzec projektowy co to się nazywa kompozyt i to jest dokładnie to czego szukasz, :wink: … a tutaj na prędko powiedzmy (…) to bym zrobil jedna klase abstrakcyjna Product i dwie klasy dziedziczące, jedną zwykła i jedną poskładaną ze zwykłą relacją has_many do sub_produktów, nadpisujące wspólny interfejs :slight_smile:

I… nie da się tego zrobić za pomocą tych dwóch modeli i kombinacji has_many, belongs_to ???

da się tylko musisz odpowiednio ustawić :class_name, :foreign_key, nazwać prawidłowo tabelę łaczącą dla has_many, i w metodzie wyświetlającej sprawdzać czy to połączenie czy gotowy produkt i dopiero wyświetlać… a przed tym wszystkim przeczytaj http://apohllo.pl/guides/association_basics.html#_asocjacja_tt_has_and_belongs_to_many_tt_2 i nie powinno być problemów

EDIT: oczywiscie przy roznych kombinacjach i tabeli laczacej masz tutaj asocjacje habtm a nie has_many

Dzięki, niestety tak jak ja to rozumiem, nie działa:

  • jwl_products id:integer name:string
  • jwl_products_parts fullproduct_id:integer part_id:integer
class Jewel < ActiveRecord::Base
  has_many :parts, :class_name => "Jewel", :through => :jwl_products_parts, :foreign_key => "part_id"
  has_many :fullproducts, :class_name => "Jewel", :through => :jwl_products_parts, :foreign_key => "fullproduct_id"

class JwlProductsParts < ActiveRecord::Base
  belongs_to :part
  belongs_to :fullproduct

Potrzebuję dwóch list:
@product.parts - z jakich części jest produkt
@product.fullproducts - na jakie produkty składa się ta część

Dostaję błąd: Could not find the association :jwl_products_parts in model Jewel

Czego nie rozumiem?

hmmm jak przetłumaczysz sobie to co dostałaś to wychodzi na to ze zapomnialas polaczyc Jewel z JwlProductsPartem i w ogole te Twoje asocjacje wygladaja troche kombinancko, poczytaj o asocjacjach troche, powaznie http://apohllo.pl/guides/association_basics.html bo bez tego to ciezko o cokolwiek …

Rozwiązanie problemu opisane jest dokładnie tutaj: http://blog.hasmanythrough.com/2007/10/30/self-referential-has-many-through

Dzięki za pomoc :wink:

Zadziala chyba tez:

class Product < ActiveRecord::Base has_and_belongs_to_many :subproducts, :class_name => 'Product', :join_table => 'jwl_products_part', :foreign_key => 'subproduct_id', :association_foreign_key => 'product_id' has_and_belongs_to_many :products, :class_name => 'Product', :join_table => 'jwl_products_part', :foreign_key => 'product_id', :association_foreign_key => 'subproduct_id' end
Ale glowy bym sobie za to nie ucial, pozatym nie wiem czy nie pomieszalem :foreign_key z :association_foreign_key