2012-11-28 98 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,...)的标识。我真的不认为挂钩或使用可观察模块会比这更好。 –