Отношения, подобные подписчикам Twitter/в ActiveRecord
Я пытаюсь представить связь между пользователями в моем приложении, где пользователь может иметь много последователей и может следовать за другими пользователями.
Я хотел бы иметь что-то вроде user.followers() и user.followed_by()
Не могли бы вы рассказать мне подробно, как это сделать с помощью ActiveRecord?
Спасибо.
Ответы
Ответ 1
Вам нужны две модели: Person и Followers
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
Модель твитер-последователя отличается от модели дружбы тем, что вам не требуется разрешение от человека следовать им. Здесь я установил ленивую загрузку, где отношения не полностью определены в объекте 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/followership.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]