Jak zamodelować relacje

Cześć,
Zastanawiam się jak za modelować takowe relacje.
Załóżmy ze jest tabelka photos zawierająca zdjecia, kluczem jej jest photo_id
Jest druga tabelka załózmy articles, w której kluczem jest article_id, zawiera ona równierz klucze do tabelki photos a mianowcie top_photo_id, middle_photo_id oraz bottom_photo_id. Każdy z tych trzech ostatnich pól może zawierać identyfikator rekordu z tabelki photos.
Każdy rekord z photos może mieć ale nie musi wpis w którymś z rekordów i w którymś z pól tabelki articles.
Da się to jakoś zamodelować za pomocą has_many itp itd., czy raczej zmienić podejście, i zrobić dodatkową tabelke, albo dwie gdzie będzie typ zdjecia itp itd…

Pozdrawiam i z góry dzięki za odpowiedz
Krzysiek

Oczywiście, że się da. To jedna z podstawowych relacji :). Na początek polecam zamienić klucze główne article_id, photo_id na proste, proponowane przez rails, które są konwencją: id.

table photos:
id integer

inne pola

table articles:
id integer
top_photo_id integer
middle_photo_id integer
bottom_photo_id integer

inne pola

[code=ruby]class Article < ActiveRecord::Base
belongs_to :top_photo, :class_name => “Photo”
belongs_to :middle_photo, :class_name => “Photo”
belongs_to :bottom_photo, :class_name => “Photo”
end

class Photo < ActiveRecord::Base
has_one :article
end[/code]

[quote=radarek]Oczywiście, że się da. To jedna z podstawowych relacji :). Na początek polecam zamienić klucze główne article_id, photo_id na proste, proponowane przez rails, które są konwencją: id.

table photos:
id integer

inne pola

table articles:
id integer
top_photo_id integer
middle_photo_id integer
bottom_photo_id integer

inne pola

[code=ruby]class Article < ActiveRecord::Base
belongs_to :top_photo, :class => “Photo”
belongs_to :middle_photo, :class => “Photo”
belongs_to :bottom_photo, :class => “Photo”
end

class Photo < ActiveRecord::Base
has_one :article
end[/code]
[/quote]
Dzięki wielkie,właśnie tego ":class => “Photo” mi brakowało :slight_smile:
pozdrawiam
Krzysiek

[quote=radarek]Oczywiście, że się da. To jedna z podstawowych relacji :). Na początek polecam zamienić klucze główne article_id, photo_id na proste, proponowane przez rails, które są konwencją: id.

table photos:
id integer

inne pola

table articles:
id integer
top_photo_id integer
middle_photo_id integer
bottom_photo_id integer

inne pola

[code=ruby]class Article < ActiveRecord::Base
belongs_to :top_photo, :class => “Photo”
belongs_to :middle_photo, :class => “Photo”
belongs_to :bottom_photo, :class => “Photo”
end

class Photo < ActiveRecord::Base
has_one :article
end[/code]
[/quote]
Hej a nie powinno być conajmniej odwrotenie co do belongs_to i has_one ?:slight_smile:

Jest dobrze :). Tak na prawdę wybór pomiędzy belongs_to a has_one polega na tym, kto trzyma referencję (klucz obcy). W tym wypadku jest to tabela articles, któtra ma 3 klucze obce, zatem ona deklaruje “belongs_to”. W praktyce nie ma to większego znaczenia, gdyż po sposobie w jaki się operuje article.top_photo i photo.article nie bardzo da się wywnioskować kto deklaruje has_one, a kto belongs_to. I dobrze, bo nie ma to dużego znaczenia. Czy w relacji rodzic <=> dziecko powiesz, że “dziecko posiada rodzica”, czy “dziecko należy do rodzica”? Oba stwierdzenia są poprawne, a tylko sposób (kto będzie posiadał klucz obcy) zmusi Cię do wybrania odpowiedniej implementacji :).

Btw, tam ma być chyba :class_name zamiast :class. Po szczegóły zaglądnij do api.

radarek chyba powinno być :class_name a nie :class :slight_smile:

Grzegorz, przeczytaj moje ostatnie zdanie z poprzedniego postu :smiley: (post był edytowany, ale to był od samego początku).

dzieki wszystkim za pomoc
Krzysiek

Kurcze faktycznie, może lepiej poprawić to było w źródle bo jakoś cieżko to zauważyć :stuck_out_tongue: