zainstalowaÂłem sobie instant rails i teraz prĂłbujĂŞ napisaĂŚ prosty skrypt nie zwiÂązany z samym rails (wywoÂływany z linii komend), ktĂłry uÂżywaĂŚ bĂŞdzie bazy mysql. w Âżaden sposĂłb nie potrafiĂŞ siĂŞ do niej “dostaĂŚ”. jak uÂżyĂŚ modu³ów zainstalowanych z rails?
ok, po³¹czy³em siê, sorry za zawracanie g³owy (pomog³o przekopiowanie drivera, pewnie jest bardziej eleganckie rozwi¹zanie).
Dodatkowo po stworzeniu nowej aplikacji w Rails mozesz wywolac jej konsole - scripts/console - i operowac na modelu (tj np na bazie) interaktywnie. To naprawde bardzo przydatna funkcjonalnosc.
hmm… generalnie w tym momencie (tworzÂą nowÂą bazĂŞ na podstawie starej), chyba nie potrzebujĂŞ w ogole modelu, chcĂŞ tylko prostym skryptem przekopiowaĂŚ dane.
poniewaÂż to pierwsza moja aplikacja, pewnie czĂŞsto bĂŞdĂŞ zadawaÂł pytania.
Chyba zaszlo male nieporozumienie. Poprzez model w railsach okreslany jest model danych, czyli baza na ktorej operujesz. Jak rozumiem chcesz uzyskac dostep do bazy danych i przeprowadzic na niej operacje (kopiowanie), czyli operujesz na modelu danych.
Zas konsola o ktorej pisze Adam pozwala Ci testowo sprawdzic relacje jakie w niej zachodza, oraz przetestowac funkcje… itp Ogolnie zobaczyc jak wyglada struktura obiektu - model danych oraz metody.
Kto pyta nie bladz w miare mozliwosci pomozemy
ja po prostu nie piszĂŞ tego w railsach, to jest skrypt, ktĂłry ma jednorazowo zaimportowaĂŚ dane. tworzenie modelu byÂłoby tu przesadÂą.
tak czy owak poradzi³em sobie i mogê przejœÌ do rails, pisz¹c aplikacjê, która bêdzie na tych danych dzia³aÌ.
Tyle wywnioskowalem:)
To bylo juz troche OT.
Chcialem podac funkcjonalnosc konsoli jako latwy interfejs dostepu do bazy danych, dzialania na modelach, zaleznosciach,mdebugowania aplikacji itd bez koniecznosci tworzenia szablonow czy kontrolerow - czesc osob nie wie, ze konsola istnieje.
ja nie wiedziaÂłem, dziĂŞki!
a skoro ju¿ jesteœmy i tak poza tematem: gdzie mogê znaleŸÌ modu³ do ruby, daj¹cy funkcjonalnoœÌ klienta http? czy jest jakieœ archiwum modu³ów, coœ jak CPAN dla perl?
(sorry, nie wiem jak to przegapiÂłem, juÂż mam).
Milym akcentem jest opowiadac innym jak rozwiazalo sie problem:)
no, pewnie wszyscy wiedzÂą, Âże Net::HTTP jest moduÂłem dostarczanym standardowo.
mam natomiast inny problem: jak obsÂługiwaĂŚ sytuacje, gdy “brakuje” pewnych danych. mam np. takÂą sytuacjĂŞ: kaÂżdy UczeĂą ma pole klasa_id, ale niektĂłrzy nie sÂą przypisani do Âżadnej klasy (z jakiejÂś tam przyczyny). kiedy prĂłbujĂŞ wywoÂłaĂŚ uczeĂą.klasa.numer dostajĂŞ b³¹d: You have a nil object when you didn’t expect it! The error occured while evaluating nil.registration – gdzie obsÂługiwaĂŚ coÂś takiego? w modelu? jak? czy moÂże w bazie stworzyĂŚ specjalnÂą “klasĂŞ” nieprzypisanych?
W moim przekonaniu wszystko zalezy od sytuacji. Ja mam analogicznie z podzespolami komputerowymi lezacymi jako zapas w magazynku IT
W mojej sytuacji najwygodnej (sugestia technikow) bylo stworzyc obiekt - komputer NIE PRZYPISANE, dzieki temu latwo jest wylistowac wszystkie wolne czesci oraz przesuwac je do istniejacych lub tworzonych zestawow.
Jednak pierwotnie radzilem sobie w inny sposob, tworzylem oddzielny widok gdzie listowalem czesci spelniajace warunek if czesc.komputer.eql? nil Analogicznie listujac czesci przypisane nakladalem w modelu warunek unless czesc.komputer.eql? nil, dzieki temu nie mialem wspomnianego przez Ciebie bledu.
W tym momencie uwazam iz bardziej eleganckim rozwiazaniem jest, przekladajac na Twoja sytuacje, dodac do klacy parametr hidden i stworzyc ukryty obiekt NIE PRZYPISANE. Do niego dodac “wolnych” uczniow. Daje to wieksze mozliwosci operowania na uczniach - bez problemu wylistujesz wszystkich, nie wazne przypisanych czy nie.
Zastanawialem sie juz jak uniwersalnie rozwiazac ten problem.
Jednym z rozwiazan jest sprawdzanie: zmienna.nil? - co czasami jest nieuniknione ale zazwyczaj nie jest wygodne, ani w moim przekonaniu “eleganckie”.
Podobnie jak opisal Marcin - tylko w ogolnosci - mozna dla nieprzypisanych elementow ustawiac wartosci, ktorych normalnie nie maja prawa osiagac. W tym przypadku ustawiac klasa_id na 0 (czy np -1) i zakladac, ze klasa o id rownym 0 nie moze istniec. W tym przypadku jeszcze ladniej byloby stworzyc klase specjalna uczniow nieprzypisanych (jak opisal Marcin). Tak niestety nie da sie postepowac zawsze - np przy dzialaniach na zmiennych, ktorych sami nie ustawiamy.
Jezeli ktos ma pomysl na uniwersalne rozwiazanie - chetnie przeczytam.
znalazÂłem rozwiÂązanie tu: http://www.ruby-forum.com/topic/52635#new
ale go nie uÂżyÂłem, zdecydowaÂłem siĂŞ jednak dodaĂŚ do bazy rzĂŞdy typu “nieprzyprzypisany” (ustawiĂŚ je teÂż na domyÂślne i daĂŚ NOT_NULL) i tam skierowaĂŚ rekordy, ktĂłre miaÂły NULL. aha, ustawianie na klasa_id = 0 teÂż nie dawaÂło identyczny efekt.
oczywiÂście nie zajmujĂŞ siĂŞ uczniami tylko samolotami
i teraz kolejny problem (wybaczcie, to moja pierwsza aplikacja): rozgryzanie paginatora
@photo_pages, @photos = paginate :photos, :per_page => 10
to jest jak rozumiem przypisanie dwĂłch tabel do wyniku funkcji paginate? (a skoro juÂż tu jesteÂśmy, to czy jest w ruby jednolinijkowy odpowiednik perlowego ($year, $month, $day) = split (/-/, $date) ?)
i teraz jak to poÂżeniĂŚ z Photo.find_by_aircraft(params[:id]) ?
od innej strony: obie akcje (list i list_by_aircraft) korzystajÂą z tego samego widoku. jak uÂżyĂŚ paginatora? czym wÂłaÂściwie jest pierwszy argument funkcji paginate?
dokladne info na temat paginatora masz tutaj:
http://api.rubyonrails.org/classes/ActionController/Pagination.html#M000082
jesli chodzi o praktyczne zastosowanie:
controller:
funkcja zwraca dwa obiekty paginator i kolekcje ActivRecord
pierwszym argumentem jest identyfikator kolekcji (tabeli w bazie)
pozostale opcje opisane sa w dokumentacji (link wyzej)
ja uzylem zmiennej doprzekazania ilosci elementow na stronie
@components_pages, @components = paginate :component,
:per_page => @items_per_page
view:
link do poprzedniej strony
<%= link_to(" <<---- ", { :page => @components_pages.current.previous }) %>
lista stron (domyslnie 1 2 3 itd
<%= pagination_links( @components_pages ) %>
link do nastepnej strony
<%= link_to(" ---->> ", { :page => @components_pages.current.next }) %>
no dobrze, wszystko fajnie jeÂśli kolekcja jest tabelÂą w bazie. a jak nie jest? jak jest wynikiem dziaÂłania pewnej metody? to jak jÂą przekazaĂŚ?
Przyznam ze nie probowalem, ale sprobuj przekazac tam poprostu kolekcje, moze sie uda
Choc pewnie bedzie ciezko, dokumentacja wyraznie mowi o kolekcji ActiveRecord
ok, ja sobie poradziÂłem tak:
@photo_pages, @photos = paginate :photos, :per_page => 2, :conditions => “aircraft_id =’” + params[:id] + “’”
ale to mi siĂŞ wydaje jak¹œ protezÂą, nie? skoro w podrĂŞczniku takÂą samÂą sytuacjĂŞ (tyle Âże bez paginacji) ka¿¹ rozwiÂązywaĂŚ definiujÂąc funkcjĂŞ find_by_aircraft w modelu, a tu nagle pomijamy model… to chyba nie jest za dobrze? gdyby to jeszcze byÂło jakieÂś proste filtrowanie (typu “pokaÂż uczniĂłw na literĂŞ A”)… no nie wiem, nie wydaje mi siĂŞ to eleganckie.
i dalej nie rozumiem, czym jest wÂłaÂściwie to :photos… myÂślaÂłem, ze juÂż zrozumiaÂłem o co chodzi w tych “symbolach”, ale jak widaĂŚ nie… identyfikatorem kolekcji? ale jak prĂłbowaÂłem
photos_by_aircraft = Photo.find_by_aircraft(id)
@photo_pages, @photos = paginate :photos_by_aircraft
… to nie dziaÂłaÂło…
jak byÂś sprĂłbowaÂł tam “przekazaĂŚ po prostu kolekcjĂŞ”?