2012-11-28 48 views
3

我有一個User模型和FollowingFollower觀察在軌場和mongoid

用戶模型

has_and_belongs_to_many :followers, class_name: 'User', inverse_of: :following 
has_and_belongs_to_many :following, class_name: 'User', inverse_of: :followers 

關注

has_and_belongs_to_many :followers, class_name: 'User', inverse_of: :following 

has_and_belongs_to_many :followings, class_name: 'User', inverse_of: :followers 

而且我有一個UserObserver應該看到,如果用戶follower_ids去改變,那麼將它添加到用戶Activities

所以,我怎麼能看只有在follower_ids的變化並獲得最新的用戶id放於activities

回答

2

我認爲這是最好的選擇,在這種情況下,是封裝在一個方法增加新的追隨者的邏輯,而且,在這種方法中,你可以觸發任何你想要的:

#encoding: utf-8 
class User 
    include Mongoid::Document 
    field :followers, type: Array 
    attr_readonly :followers 

    def add_new_follower(new_follower) 
    unless followers.include?(user) 
     followers << user 
     trigger_added_follower_observers(user) 
    end 
    end 

    private 
    def trigger_added_follower_observers(new_follower) 
    # trigger the stuff you want 
    end 
end 

有其他選擇,比如使用Ruby的可觀察模塊(http://www.ruby-doc.org/stdlib-1.9.3/libdoc/observer/rdoc/Observable.html),MongoID觀察員(HTTP: //mongoid.org/en/mongoid/docs/callbacks.html#observers)或before_save掛鉤,但恕我直言,我認爲上面的代碼是最好的選擇,沒有「傷害」你的模型。

希望它有幫助。

+0

你能告訴我如何做到這一點用戶觀察員?因爲觸發器可能適用於此,但我希望有一個類可以自己處理用戶活動,比如有一個新的帖子不只是新的跟隨者,並且觸發器無處不在的代碼會很糟 –

+1

您可以將# trigger_added_follower_observers方法調用#call_observer並更改方法的簽名以接收標識符(符號)以標識模型的哪個部分已更改。然後,在該方法中,您將實例化您的UserObserver傳遞自我(用戶)和已更改內容(:followers,:posts,...)的標識。我真的不認爲掛鉤或使用可觀察模塊會比這更好。 –