Отношения, подобные подписчикам в Твиттере / следуют в ActiveRecord - PullRequest
14 голосов
/ 03 августа 2010

Я пытаюсь представить отношения между пользователями в моем приложении, где у пользователя может быть много подписчиков, и он может подписываться на других пользователей. Я хотел бы иметь что-то вроде user.followers () и user.followed_by () Не могли бы вы рассказать мне подробнее, как представить это с помощью ActiveRecord?

Спасибо.

Ответы [ 2 ]

34 голосов
/ 03 августа 2010

Вам нужны две модели, Персона и Подписчики

rails generate model Person name:string
rails generate model Followings person_id:integer follower_id:integer blocked:boolean

и следующий код в моделях

class Person < ActiveRecord::Base
  has_many :followers, :class_name => 'Followings', :foreign_key => 'person_id'
  has_many :following, :class_name => 'Followings', :foreign_key => 'follower_id' 
end

и соответствующий в классе Followings вы пишете

class Followings < ActiveRecord::Base
  belongs_to :person
  belongs_to :follower, :class_name => 'Person'
end

Вы могли бы сделать имена более понятными по своему вкусу (мне особенно не нравится Followings -name), но это должно помочь вам начать.

2 голосов
/ 03 августа 2010

Модель подписчика в Твиттере отличается от модели дружбы тем, что вам не нужно разрешение от человека, чтобы следить за ними.Здесь я настраиваю ленивую загрузку, где отношение не полностью определено в объекте person.

/ app / models / person.rb

  def followers
    Followership.where(:leader_id=>self.id).not_blocked
  end

  def following
    Followership.where(:follower_id=>:self.id).not_blocked
  end
  has_many :followers, :class_name=>'Followership'
  has_many :followed_by, :class_name=>'Followership'

/ app / models / followhip.rb

  belongs_to :leader, :class_name=>'Person'
  belongs_to :follower, :class_name=>'Person'

  #leader_id integer
  #follower_id integer
  #blocked boolean

  scope :not_blocked, :conditions => ['blocked = ?', false] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...