Creazione di associazioni Rails
Domanda
Sto avendo difficoltà a capire come creare le seguenti associazioni:
- L'utente ha molti album di foto
- Photo Album ha molte foto
- Gli utenti possono seguire qualcun altro specifico album di foto (e, indirettamente, finiscono dopo il proprietario del album fotografico) e hanno le foto mostrano in un tipo di scenario "news feed", quindi ci deve essere un qualche tipo di rapporto che si instaura tra li
Ecco le associazioni che ho:
class User < ActiveRecord::Base
has_many :photo_albums
has_many :photos
has_many :relationships, :foreign_key => "follower_id",
:dependent => :destroy
has_many :reverse_relationships, :foreign_key => "followed_id",
:class_name => "Relationship",
:dependent => :destroy
has_many :followings, :through => :relationships, :source => :followed
has_many :followers, :through => :reverse_relationships, :source => :follower
end
class PhotoAlbum < ActiveRecord::Base
belongs_to :user
has_many :photos
end
class Photo < ActiveRecord::Base
belongs_to :user
belongs_to :photo_album
end
class Relationship < ActiveRecord::Base
belongs_to :follower, :foreign_key => "follower_id", :class_name => "User"
belongs_to :followed, :foreign_key => "followed_id", :class_name => "User"
end
Come posso fare a dove posso solo ottenere tutte le immagini degli album di foto che l'utente sta ancora seguendo?
Esempio:
- Jane ha 2 album fotografici "di Jane pubblica Stuff" e "di Jane privato Stuff" con le foto di ognuno di loro.
- Bob segue solo "di Jane pubblica Stuff" così come posso tornare le foto da solo album di foto tramite le associazioni di ActiveRecord?
Qualcosa di simile bob.followings.photos
che restituisce foto da solo gli album fotografici che Bob seguendo ... o anche bob.followings.photo_albums
per ottenere una raccolta di tutti gli album fotografici che Bob sta seguendo
So che probabilmente c'è una lunga strada da fare questo, ma c'è un modo più semplice utilizzando le associazioni di ActiveRecord?
Grazie per qualsiasi consiglio o di orientamento è possibile fornire! I really appreciate it!
Soluzione
Il modo in cui lo avete configurato, seguito associa un utente a un altro, non è un utente a un PhotoAlbum, che è ciò che si descrive. Sembra come se si desidera
class Relationship < ActiveRecord::Base
belongs_to :follower, :foreign_key => "follower_id", :class_name => "User"
belongs_to :followed, :foreign_key => "photo_album_id", :class_name => "PhotoAlbum"
end
Con il fatto che, una leggera modifica della risposta di davidb dovrebbe darvi ciò che si vuole:
def followings_photos
Photo.where(:photo_album_id => self.followings.collect(&:id))
end
Altri suggerimenti
Si consiglia di guardare il gioiello amistad
a https://github.com/raw1z/amistad, che ti dà gli amici e amicizie funzionalità. Nel tuo caso, un amico potrebbe essere un seguace.
Poi si può fare qualcosa di simile user.friends.each do |f|
per recuperare tutti i seguaci di user
e poi f.photos
per ottenere tutte le immagini da ogni seguace.
provare questo nel modello User:
def followings_photos
Photo.where(:user_id => self.followings.collect(&:id))
end