Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Observing a field in rails and mongoid

I have a User model and Following, Follower

User Model

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

Followers

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

Following

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

And I have a UserObserver which should see if user follower_ids go changed then add it to the user Activities

So how can I watch changes only in follower_ids and get the latest user id to put in the activities

like image 310
Seif Sallam Avatar asked Dec 11 '25 01:12

Seif Sallam


1 Answers

I think that the best option, in this case, is to encapsulate the logic of adding new followers in a method, and, in this method, you can trigger whatever you want:

#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

There are alternative options, like use ruby's Observable module (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/observer/rdoc/Observable.html), MongoID observers (http://mongoid.org/en/mongoid/docs/callbacks.html#observers), or before_save hook, however IMHO i think the above's code is the best option you have, without "hurting" your model.

Hope it helps.

like image 133
Rudy Seidinger Avatar answered Dec 13 '25 21:12

Rudy Seidinger



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!