Szarpanina z attachment fu

Witam!

Tworze galerie zdjec i do uploadu plikow uzylem attachent fu. Pierwszy raz tego uzywam, wiec jestem zielony w temacie :confused:

Utworzylem tabele:

create_table "pliks", :force => true do |t| t.string "filename" t.integer "size" t.string "content_type" t.string "thumbnail" t.integer "parent_id" t.integer "height" t.integer "width" t.text "description" t.string "title" t.string "gallery_nazwa" t.datetime "created_at" t.datetime "updated_at" end
Musialem dodac pole do galerii, bo uzytkownik bedzie tez tworzyl galerie, do ktorych bedzie pozniej wlasnie te zdjecia wrzucal.

Niestety przy zapisywaniu:

[code]def dodaj_zdjecie_do

@galerie=Gallery.find(:all)

if request.post? and params[:plik]
  
  plik = Plik.new(params[:plik])
  
  plik.save
  flash[:notice] = "zdjecie dodane"
  
end

end[/code]
attachment_fu ma (jak dla mnie) jakas dziwna strategie zapisywania plikow… Tworzy katalog 0000 a wnim podkatalogi 0001, 0005 :confused: To by jeszcze uszlo, gdyby w bazie danych zapisywal normalnie… Niestety jest tam tak:

http://rapidshare.com/files/184566465/baza.bmp.html

Zapisuje do gallery_nazwa tylko dla pliku o pelnym rozmiarze.
Tutaj moje pierwsze pytanie: Czy mozna gdzies ustawic, zeby zapisywal tez do tego pola dla miniatur tego pliku?

Drugie pytanie dotyczy zapisywania tych plikow… Sa porozrzucane po katalogach… Mozna zmienic moze cos w jakichs ustawieniach, zeby wszystkie byly w jednym katalogu?

Czesto uzywalem skryptu do generowania galerii: http://www.kurshtml.boo.pl/skrypty/skrypt_galerii,galeria.html
Bo… jest naprawde “sympatyczny” :wink:
Mozna go jakos teraz wykorzystac? Dokladnie, to czy mozna za pomocą attachment_fu pobierać lokalizację plików potrzebną do skryptu, bo w bazie ich nie ma :confused:

Dzieki za wszelka pomoc.
Pozdrawiam!

Ewentualnie… mogl bym zrobic model/tabele ‘picture’, ktora miala by 1 do 1 tabele plik… (powiedzcie, czy to dobre rozwiazanie?). Tylko to tez nie rozwiazuje problemu miejsca w ktorym znajduje sie plik do skryptu, ktory chcial bym uzyc… :confused:

Aby zmienić sposób zapisywania, musisz przerobić metodę partitioned_path w file_system_backend.rb.

A co do tych miniaturek, to attachment_fu traktuje zarówno oryginalne zdjęcie i miniaturki jako jeden rekord, dlatego zapisuje nazwę galerii tylko w głównym zdjęciu.

rysic: to “dziwaczne” zapisywanie jest po to, żeby przy bardzo dużej ilości plików zmniejszyć liczbę katalogów w jednym podkatalogu (maksymalnie 1000). Inaczej przy dużej liczbie zdjęć system może mieć problemy.

W takim razie… Chyba bede musial zrobic w ten sposob, ze utworze dwie tabele: picture i file - 1 do 1 a potem zamiast skryptu uzyc paginacji… :confused:

Chyba za mocno kombinujesz, jeśli chcesz wyświetlić mniejsze zdjęcie to piszesz np.:

<%= image_tag(picture.public_filename(:small)) -%>

przekazując po prostu nazwę thumbnaila jako parametr do public_filename

a jeśli oryginał to po prostu

<%= image_tag(picture.public_filename) -%>

zakładając ze picture to obiekt danego zdjęcia w galerii.

attachment_fu zakłada po prostu relację jeden oryginał do wielu miniaturek i używa do tego klucza :parent_id

To że, zdjęcia są “porozrzucane” to tak jak pisał drogus zabezpieczenie przed spowolnieniem systemu plików przy ogromnej ilości zdjęć.

Chyba macie racje :slight_smile: Jakos udalo mi sie to wszystko ogarnac i uproscic :slight_smile: Zostala tylko ta nieszczesna paginacja…
Powiedzcie mi tylko co daje powkladanie tego do katalogow dla systemu? Nie musi wyszukiwac wsrod wielkiej ilosci plikow w jednym katalogu?
Jeszcze pytanko, co jesli uzytkownik bedzie chcial miec wiecej zdjec, niz 1000 (gdy to napisalem, to wydaje mi sie nie mozliwe, ale jesli… :wink: )?

EDIT:

Jest jeszcze jeden problem zwiazany z tematem :slight_smile:

Mam powiazana galerie z plikami nie za pomoca pliku id, tylko nazwy galerii i przy usuwaniu galerii musze usunac tez pliki zdjecia.

Robie to tak:

[code]def usun_galerie

@galerie = Gallery.find(:all)

if params[:id]
  @galeria = params[:id]
  Gallery.delete(Gallery.find_by_nazwa(@galeria))
  
  @pliki = Plik.find_all_by_gallery_nazwa(@galeria)
  
  @pliki.each do |plik|
    Plik.delete(plik)
  end
  flash[:notice] = "Galeria '#{@galeria}' oraz jej zdjęcia usunięte!"
  
  
end

end[/code]
Ale po pierwsze attachment_fu gallery_nazwa przypisuje tylko do pliku glownego a po drugie w ten sposob usuwam tylko wpisy w bazie :confused: W jaki spob usunac pliki a nie tylko wpisy?

Probowalem wczesniej zrobic to bez petli, ale niestety wywala sie w ten sposob…

[code]def usun_galerie

@galerie = Gallery.find(:all)

if params[:id]
  @galeria = params[:id]
  Gallery.delete(Gallery.find_by_nazwa(@galeria))
  Plik.delete_all(Plik.find_all_by_gallery_nazwa(@galeria))
  flash[:notice] = "Galeria '#{@galeria}' oraz jej zdjęcia usunięte!"
  
  
end

end[/code]

Juz wiem :slight_smile:

Zamiast “Plik.delete(plik)” trzeba uzyc Plik.destroy(plik) i wtedy usuwa i pliki i wszystkie wpisy w baze do tych plikow.

Wielkie dzieki za ponoc!