powiązania między modelami

Robię projekt na zaliczenie i mam pewien problem, mam model user i photo (one-to-many), potrzebuje jeszcze model atrybut bo każde zdjęcie będzie miało atrybuty i teraz pytanie jak powinna wyglądać relacja ? Czy ma być to (many-to-many) czy może być (one-to-many), jeżeli many-to-many to czy mogę zrobić po prostu has_many dla photo i has_many dla atrybutów czy musi być has_many :through. Poza tym będę musiał wukonywać działania na zdjęciach i atrybutach i wynik zapisywać (najprawdopodobniej do bazy) wiec czy potrzebuje jeszcze jeden model ?
W railsach działam trzy tygodnie wiec proszę o jak najprostsze rozwiązanie, nie musi być pro :).
Z góry bardzo dziękuję za każdą pomoc.

atrybut? a nie wystarczy ci pole dodatkowe (walisz migracje, dodajesz pole i po sprawie)

Opisz dokładnie Use Case jakiś konkretny by było wiadomo co z tym atrybutem, tak to cięzko powiedzieć czy zdjęcie ma mieć jeden, czy wiele itp

Niestety jedno pole nie wystarczy i co wiecej kazano mi zrobic oddzielną tabelę na “atrybuty”.
Ma to działać tak, że user dodaje foto, potem słowa kluczowe dotyczące danego foto np. (góry, alpy, śnieg).
A na koniec za pomocą Formalnej alnalizy pojęć (proponuje nawet nie sprawdzać co to jest :slight_smile: ) będą tworzone
specjalne pary {(foto,…,foto_n), (atrybut,…,atrybut_n)}. Po dodaniu atrybutu lub foto cała ta krata “macierz”
ma być uaktualniana wiec chyba też powinienem ją zapisać do bazy i nie wiem czy tu też jakiś model tworzyć.
Nie potrafie takiego wstępnego szkieletu ogarnąć.

Czyli tag ;] masz do tego plugin, jak chcesz coś z serii acts_as… czyli acts_as_tag czy jakoś tak, ale to na tyle proste że można napisać samemu.

Potrzebujesz modelu tag, do tagów, oraz jakiegoś łączącego
czyli będzie miał
modele:

  • fotos
  • tags
  • fotos_tags
    coś takiego w tym łączonym zapisujesz foto_id, oraz tag_id.

Mówiąc prościej potrzebujesz relacji HABTM (has_and_belongs_to_many) łatwo to znajdziesz po tej nazwei z gotowymi rozwiązaniami. Ale plugin (gem) załatwi ci to z automatu.

Do tego plugin (gem) ma dodatki jak automatyczne generowanie chmur najczęściej używanych tagów itp

Ok czyli relacja many-to-many, z tym że tu http://guides.rubyonrails.org/association_basics.html jest napisane, że jeżeli chcemy pracować z tym relacyjnym modelem “fotos_tags” to lepiej wybrać has_many :through. Tutaj właśnie nie do końca ogarniam czym różni się has_many :through od has_and_belongs_to_many tzn. rozumiem, że habtm tworzy tylko wirtualną tabelę ? (nie wie czy to jakiś odpowiednik sql-owego widoku).
Rozumiem, że jezeli zrobie has_many :through to w tym relacyjnym modelu będę mół np. zdefiniować jakieś callbacki (tzn. nie wiem jeszcze czy powinny byc w modelu czy kontrolerze) ?
Ogólnie nie potrafie sprecyzować przy jakim powiązaniu będzie to najlepiej działać.
Gem-a bym chętnie obejrzał ale tak na szybko znalazlem tylko acts_as_tree.
Niestety FCA musze zaimplementować bo to zasadniczy temat tego projektu :(.

Może jeszcze ianczej czy coś takiego zadziała ?

User < ActiveRecord::Base
has_many :photos, :dependent => :destroy

Photo < ActiveRecord::Base
belongs_to :user
has_many :photo_tags
has_many :tags , :through => :photo_tags

Tag < ActiveRecord::Base
has_many :photo_tags
has_many :photos , :through => :photo_tags

Photo_Tag < ActiveRecord::Base
belongs_to :photo
belongs_to :tag

I czy jezeli np. usunę usera to automatycznie zostaną usunięte jego zdjęcia i tagi,
tzn. zdjęcia juz działają i sa usówane teraz się nad resztą zastanawiam.
Natomiast nie wiem czy będę potrafił to ogarnąć i dlatego zastanawiałem się czy
może być tak że Photo has_many :tags i Tag belongs_to: photo

Gem masz tu: jeden z:
https://rubygems.org/gems/acts-as-taggable-on

Może poprost odpal sobie filmik. 15 minut i powinieneś wszystko kumać. Będzie szybciej ;]
http://railscasts.com/episodes/167-more-on-virtual-attributes

Przy okazji polecam wszystkie filmy, dzień-dwa i powinno stać się wszystko jaśniejsze ;]

Ok dziękuję za pomoc, Pozdrawiam.