Integracja z hurtownią bielizny Kontri - problem z plikiem xml

Witam. Robię sklep internetowy z bielizną damską i chcę zintegrować produkty z hurtownią kontri mój kod ruby to :

            require 'net/http'
            require 'rexml/document'
            require 'rubygems'
            require 'pg'

            url ='http://www.hurtowniaonline.pl/public/xml/HKPL_Hurtownia/listproducts_data_HKPL_Hurtownia_pl-PL_PLN.xml'
            xml_data = Net::HTTP.get_response(URI.parse(url)).body
            doc = REXML::Document.new(xml_data)

                    kategoria_id = []
                    kategoria_nazwa = []
                    typ_id = []
                    typ_nazwa = []
                    kolor_id = []
                    kolor_nazwa = []
                    rozmiar_id = []
                    rozmiar_nazwa = []

                    produkt_id = []
                    towar_nazwa = []
                    cena_netto = []
                    kategoria_kontri = []
                    typ_kontri = []
                    producent_nazwa = []
                    rodzaj_oferty = []
                    kolory_id = []
                    rozmiar_kontri = []
                    ilosc_kontri = []
                    kolory_ilosc_ki = []

                                    doc.elements.each('ROOT/TOWARY/PRODUKT') do |b| 
                                         produkt_id << b.attributes["produkt_id"]
                                    
                                    end

                                    doc.elements.each('ROOT/TOWARY/PRODUKT/TOWAR') do |b|
                                            towar_nazwa << b.text
                                    end

                                    doc.elements.each('ROOT/TOWARY/PRODUKT/CENA_NETTO') do |b|
                                            cena_netto << b.text
                                    end

                                    doc.elements.each('ROOT/TOWARY/PRODUKT/KATEGORIA') do |b|
                                            kategoria_kontri << b.text
                                    end

                                    doc.elements.each('ROOT/TOWARY/PRODUKT/TYP') do |b| 
                                            typ_kontri << b.text
                                    end
                                    
                                    doc.elements.each('ROOT/TOWARY/PRODUKT/PRODUCENT') do |b| 
                                            producent_nazwa << b.text
                                    end

                                    doc.elements.each('ROOT/TOWARY/PRODUKT/RODZAJ_OFERTY') do |b| 
                                            rodzaj_oferty << b.text
                                    end

                                    doc.elements.each('ROOT/TOWARY/PRODUKT/KOLORY/KOLOR/KOLOR_ID') do |b| 
                                            kolory_id << b.text
                                    end

                                    doc.elements.each('ROOT/TOWARY/PRODUKT/KOLORY/KOLOR/ROZMIAR') do |b| 
                                            rozmiar_kontri << b.text
                                    end

                                    doc.elements.each('ROOT/TOWARY/PRODUKT/KOLORY/KOLOR/ILOSC') do |b| 
                                            ilosc_kontri << b.text
                                    end


                            doc.elements.each('ROOT/KATEGORIE/KATEGORIA') do |a| 
                                    kategoria_id << a.attributes["kategoria_id"]
                            end

                            doc.elements.each('ROOT/TYPY/TYP') do |a|
                                    typ_id << a.attributes["typ_id"]
                            end

                            doc.elements.each('ROOT/KOLORY/KOLOR') do |a|
                                    kolor_id << a.attributes["kolor_id"]
                            end     

                            doc.elements.each('ROOT/ROZMIARY/ROZMIAR') do |a| 
                                    rozmiar_id << a.attributes["rozmiar_id"]
                            end

                            doc.elements.each('ROOT/KATEGORIE/KATEGORIA') do |ele|
                                    kategoria_nazwa << ele.text
                            end
                            doc.elements.each('ROOT/TYPY/TYP') do |ele|
                                    typ_nazwa << ele.text
                            end
                            doc.elements.each('ROOT/KOLORY/KOLOR') do |ele|
                                    kolor_nazwa << ele.text
                            end
                            doc.elements.each('ROOT/ROZMIARY/ROZMIAR') do |ele|
                                    rozmiar_nazwa << ele.text
                            end

            conn = PGconn.connect('',5432,'','','hot')

            res = conn.exec("SELECT k_id FROM kategoria")

            res.each do |row|
                    row.each do |column|
                        #puts "#{column}"
                    end
            end

            produkt_id.each_with_index do |b, c|

                #conn.exec("INSERT INTO towar_kontris (produkt_id, towar, cena_netto) VALUES ('#{b}','#{towar_nazwa[c].gsub(/[']/, ' ')}', '#{cena_netto[c]}')")

            end

            kolory_id.each_with_index do |d, e|

                conn.exec("INSERT INTO kolor_kontris (kolor_id, rozmiar, ilosc) VALUES ('#{d}','#{rozmiar_kontri[e]}','#{ilosc_kontri[e]}')")

            end

            kategoria_id.each_with_index do |a, b|

                #conn.exec("INSERT INTO kategoria (k_id, k_nazwa) VALUES ('#{a}', '#{kategoria_nazwa[b]}')")

            end

            typ_id.each_with_index do |a, b|

               #conn.exec("INSERT INTO typs (t_id, t_nazwa) VALUES ('#{a}','#{typ_nazwa[b]}')")

            end

            kolor_id.each_with_index do |a, b|

                #conn.exec("INSERT INTO kolors (kolor_id, kolor_nazwa) VALUES ('#{a}', '#{kolor_nazwa[b]}')")

            end

            rozmiar_id.each_with_index do |a, b|

                #conn.exec("INSERT INTO rozmiars (r_id, r_nazwa) VALUES ('#{a}', '#{rozmiar_nazwa[b]}')")

            end
        redirect_to(:action => 'index') 

oto część pliku xml udostępnianego przez hurtownię do integracji :

Gallantry 274-2 64.59 239 240 Gallantry.Gallantry[Gal] Oferta biezaca 99341 5 1.00 7890 5 1.00 101352 5 2.00 Kamea Virginia 13.00 239 242 Kamea.Kamea[Kam] Promocja 7644 5 11.00

Problem polega na tym, iż system sam dodaje dane do tabel oddzielna jest tabela dla towarów a oddzielna dla kolorów, rekordów w tabeli towarowej jest np.: 3576 a w tabeli kolorów 57896 , nie wiem jak mam powiązać ilość towarów do ilości kolorów aby system wiedział że dany kolor należy do danego produktu. Gdyby <KOLOR_ID> posiadał, produkt_id to nie było by problemu a tak poprostu nie mogę tego ogarnąć, może ktoś już miał podobny problem.

W kwestii dodatkowego wyjaśnienia:
Oto tabela postgresql
towar_kontris

a oto tabela kolor_kontris

kod odpowiadający za dodawanie do tabeli towar_kontris linijka jest zakomentowana aby nie przeszkadzała w testowaniu aplikacji

[code]produkt_id.each_with_index do |b, c|

                #conn.exec("INSERT INTO towar_kontris (produkt_id, towar, cena_netto) VALUES ('#{b}','#{towar_nazwa[c].gsub(/[']/, ' ')}', '#{cena_netto[c]}')")

            end[/code]

kod odpowiadający za dodawanie do tabeli kolor_kontris

Jest tak:

[code]kolory_id.each_with_index do |d, e|

                conn.exec("INSERT INTO kolor_kontris (kolor_id, rozmiar, ilosc) VALUES ('#{d}','#{rozmiar_kontri[e]}','#{ilosc_kontri[e]}')")

            end[/code]

Kombinowałem tak :

[code]kolory_id.each_with_index do |d, e|

                conn.exec("INSERT INTO kolor_kontris (kolor_pow, kolor_id, rozmiar, ilosc) VALUES ('#{produkt_id[e]}', '#{d}','#{rozmiar_kontri[e]}','#{ilosc_kontri[e]}')")

            end[/code]

ale to nic nie dało :frowning:

Potrzebujesz trzeciej tabeli zachowującej informacje o tym w jakich kolorach jest dostępny day produkt, czyli przechowującej kolor_id i produkt_id.

Dziękuję za pomocną dłoń.
Niewiem jak zrobić taką tabelę. Nie wiem jak przy iloci np 3578 produktów a przy 5789 kolorów powiązać te rekordy

[quote=2strefa]Dziękuję za pomocną dłoń.
Niewiem jak zrobić taką tabelę. Nie wiem jak przy iloci np 3578 produktów a przy 5789 kolorów powiązać te rekordy[/quote]
Jeżeli robisz ten sklep, bo chcesz go uruchomić, to może lepiej przyjrzyj się spree: http://spreecommerce.com/. Wyjdzie pewnie taniej, szybciej i bezpieczniej.

Co do samego problemu, to musisz zrobić relację “wiele do wielu”, w tym wypadku będzie to color_products, która będzie wyglądała mniej więcej tak:

create_table :color_products do |t| t.reference :product t.reference :color end
W tym momencie możesz tam wstawiać pary produkt-kolor. Tzn. jeżeli np. chcesz dla produktu o id 100, do którego będą przypisane kolory o id 5, 8, i 12, to skończysz z takimi wpisami w tabeli color_products:

id, product_id, color_id 1, 100, 5 2, 100, 8 3, 100, 12
I od razu dobra rada co do nazewnictwa: najlepiej nazywaj nazwy tabeli, kolumn, zmienne i wszystko inne co jest kodem aplikacji nazwami angielskimi, towar_kontris brzmi conajmniej komicznie :wink: A jeżeli już musisz to użyj inflections (w pliku config/initializers/inflections.rb), żeby dostać poprawną liczbę mnogą od nazwy modelu.

i jednak trzymaj się jakichś konwencji, pole produkt_id trzyma ID producenta? o co kaman? :smiley:

Dzięki za pomoc.
Dzisiaj w pracy spróbuję ogarnąć tę koncepcję Drogus’a co do relacji “wiele do wielu”.
Zlw co do konwencji to masz 100% racji to miało być ID produktu pomyliłem się w nazewnictwie przy opisywaniu screenshotów.

Obawiam się, że sklep który robię to trochę zaduża kobyła. Chyba że spree można jeszcze rozbudowywać i modyfikować pod swoją modłę.
Oto szablon mojego sklepu ostylowany i okodowany pod jQuary http://rafal-serwer.gogler.eu to jest tylko strona główna szablonów graficznych posiada około 20, od widoków produktów aż na panelu klienta kończąc.
Jako panel CMS wybrałem Active Admin, jeżeli uważasz że spree dało by radę to i może bym się przesiadł na niego

spree idealnie nadaje sie pod rozbudowywanie, trzeba sie tylko “nauczyc go”

http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association
szablon fajny