2010-08-03 15 views
12

Sto provando a rappresentare una relazione tra utenti nella mia applicazione in cui un utente può avere molti follower e può seguire altri utenti. Mi piacerebbe avere qualcosa come user.followers() e user.followed_by() Potresti dirmi in dettaglio come rappresentare ciò usando ActiveRecord?Relazione come follower su Twitter/seguita in ActiveRecord

Grazie.

risposta

30

Hai bisogno di due modelli, una persona e un chi segue

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

e il seguente codice nei modelli

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 

e corrispondente nella classe chi segue si scrive

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

si potrebbe rendere i nomi più chiara a proprio piacimento (soprattutto non mi piace il Followings -name), ma questo dovrebbe iniziare.

2

Il modello di follower di Twitter si differenzia dal modello di amicizia in quanto non è necessario il permesso da parte della persona per seguirli. Qui ho impostato un caricamento pigro in cui la relazione non è completamente definita nell'oggetto persona.

/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] 
Problemi correlati