HABTM mongoid servo / servo

Mongoid ships with .push on habtm, which establishes habtm relationships in both directions. Although delete will # delete the related record, there is no documented way to delete only the relationships that I saw. Is there a better way to do this?

Is there a better way to ensure uniqueness?

has_and_belongs_to_many :following, {class_name: 'User', inverse_of: :followers, inverse_class_name: 'User'}
  has_and_belongs_to_many :followers, {class_name: 'User', inverse_of: :following, inverse_class_name: 'User'}

  def follow!(user)
    self.following.push(user) # this pushes the inverse as well
    self.following_ids.uniq!
    self.save!
    user.follower_ids.uniq!
    user.save!
  end

  def unfollow!(user)
    self.following.delete(user.id)
    self.save!
    user.followers.delete(self.id)
    user.save!
  end
+5
source share
1 answer

The following code worked fine for me (mongoid 2.3.x):

class User
  include Mongoid::Document

  field :name, type: String

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

  def follow!(user)
    if self.id != user.id && !self.following.include?(user)
      self.following << user
    end
  end

  def unfollow!(user)
    self.following.delete(user)
  end
end

No inverse_class_name, no saving calls, no special handling, but self-service exception.

, mongoid dependent: nullify, . autosave: true ( , ). , mongoid ( 2.0.0.x).

if- , (else raise FooException).

.delete(user) , mongoid: http://mongoid.org/docs/relations/referenced/n-n.html ( "DEPENDENT BEHAVIOR" ).

+18

All Articles