Создание ассоциаций Rails - PullRequest
       34

Создание ассоциаций Rails

1 голос
/ 19 октября 2011

Мне трудно понять, как создать следующие ассоциации:

  • У пользователя много фотоальбомов
  • Фотоальбом имеет много фотографий
  • Пользователи могут следить за чьим-то конкретным фотоальбомом (и косвенно они в конечном итоге следуют за владельцем фотоальбома) и отображать фотографии в сценарии типа «новостной ленты», поэтому между ними должна быть установлена ​​какая-то связь их

Вот ассоциации, которые у меня есть:

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

Как мне сделать так, чтобы я мог просто получить все фотографии из фотоальбомов, за которыми следит пользователь?

Пример:

  • У Джейн есть 2 фотоальбома: "Публичная публика Джейн" и "Приват Джейн" Материал "с фотографиями в каждом из них.
  • Боб следует ТОЛЬКО "Общественным материалам Джейн", так как я могу вернуть фотографии только из этого фотоальбома через ассоциации ActiveRecord?

Что-то вроде bob.followings.photos, которое возвращает фотографии ТОЛЬКО из фотоальбомов, за которыми следит Боб ... или даже bob.followings.photo_albums, чтобы получить коллекцию всех фотоальбомов, за которыми следит Боб

Я знаю, что, вероятно, есть длинный путь для этого, но есть ли более простой способ использования ассоциаций ActiveRecord?

Спасибо за любые советы или рекомендации, которые вы можете предоставить! Я действительно ценю это!

Ответы [ 3 ]

2 голосов
/ 20 октября 2011

Способ, которым вы его настроили, после того, как пользователь ассоциируется с другим пользователем, а не с пользователем в фотоальбоме, что вы и описываете. Звучит так, как будто вы хотите

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

После этого небольшая модификация ответа davidb должна дать вам то, что вы хотите:

def followings_photos
      Photo.where(:photo_album_id => self.followings.collect(&:id))
end
1 голос
/ 19 октября 2011

попробуйте это в модели пользователя:

def followings_photos
      Photo.where(:user_id => self.followings.collect(&:id))
end
1 голос
/ 19 октября 2011

Возможно, вы захотите взглянуть на камень amistad на https://github.com/raw1z/amistad,, который дает вам функциональность друзей и друзей.В вашем случае друг будет подписчиком.

Затем вы можете сделать что-то вроде user.friends.each do |f|, чтобы получить всех подписчиков user, а затем f.photos, чтобы получить все фотографии от каждого подписчика.1009 *

...