2010-08-03 13 views
12

Kullanıcılarımın bir çok takipçiye sahip olabileceği ve diğer kullanıcıları da takip edebileceği kullanıcılar arasında bir ilişkiyi temsil etmeye çalışıyorum. user.followers() ve user.followed_by() gibi bir şeye sahip olmak istiyorum. Bunu ActiveRecord'u kullanarak nasıl temsil edeceğinizi ayrıntılı olarak söyler misiniz?Twitter'da takip edilenler gibi ilişkiler/takip edilenler ActiveRecord

Teşekkürler.

cevap

30

Sen iki model, bir Kişiyi ve aşağıdaki Gönderen

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

ve aşağıdaki kodda bulunan modeller

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 

ve × daki sınıfında karşılık gelen sen, (i özellikle Followings -Name sevmiyorum)

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

Sen beğeninize isimler daha net yapabilir yazma, ancak bu başlangıç ​​almalısınız.

2

Twitter takipçisi model, arkadaşlık modelinden farklıdır, böylece onları takip etmek için izninizin iznine gerek yoktur. Burada ilişkinin kişi nesnesinde tam olarak tanımlanmadığı bir tembel yükleme kurdum.

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