2010-08-03 32 views
12

Tôi đang cố gắng thể hiện mối quan hệ giữa người dùng trong ứng dụng của mình nơi người dùng có thể có nhiều người theo dõi và có thể theo dõi những người dùng khác. Tôi muốn có một cái gì đó như user.followers() và user.followed_by() Bạn có thể cho tôi biết chi tiết cách thể hiện điều này bằng ActiveRecord không?Mối quan hệ như người theo dõi Twitter/được theo dõi trong ActiveRecord

Cảm ơn.

Trả lời

30

Bạn cần hai mô hình, một Person và sau

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

và mã sau trong các mô hình

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 

và tương ứng trong lớp sau bạn viết

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

Bạn có thể làm cho những cái tên rõ ràng hơn theo ý thích của bạn (i đặc biệt không thích những Followings -name), nhưng điều này sẽ giúp bạn bắt đầu.

2

Mô hình theo dõi twitter khác với mô hình tình bạn ở chỗ bạn không cần sự cho phép của người đó để theo dõi họ. Ở đây tôi thiết lập một tải lười biếng, nơi mối quan hệ không được xác định đầy đủ trong đối tượng người.

/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] 
Các vấn đề liên quan