Отношения как подписчики/следовать в Твиттере в ActiveRecord

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

Спасибо.

14
задан soulnafein 3 August 2010 в 15:12
поделиться

2 ответа

Вам нужны две модели, Person и Followings

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-имя), но это должно помочь вам начать.

34
ответ дан 1 December 2019 в 07:27
поделиться

Модель подписчиков в Твиттере отличается от модели дружбы тем, что вам не нужно разрешение от человека, чтобы подписаться на них. Здесь я настроил отложенную загрузку, когда отношения не полностью определены в объекте 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] 
2
ответ дан 1 December 2019 в 07:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: