toy
toy

Reputation: 12161

How to reuse same class for referenced children in Mongoid?

I have two models like this

class User
  include Mongoid::Document

  has_one :tweet
  has_many :tweet
end

class Tweet
    include Mongoid::Document
    belongs_to :created_by,     class_name: "User"

end

Surely, this one doesn't work but this is what I want to get to. Basically, A tweet should have one created_by and a lot of mentioned users. For example, if a tweet is like this

"Today I met @user1 and @user2"

The Tweets collection should be something like this

{
 "created_by_id" : "ObjectId("of created user"),
 "mentioned_user_ids : [ObjectId("user1"), ObjectId("user2")]
}

And Users collection should be something like this

{
 "_id" : ObjectId("of created user")
},
{
 "_id" : ObjectId("user1")
},
{
 "_id" : ObjectId("user2")
}

Upvotes: 0

Views: 46

Answers (1)

rjurado01
rjurado01

Reputation: 5535

This should work:

class User
  include Mongoid::Document

  has_many :owner_tweets, class_name: 'Tweet', inverse_of: :created_by
end

class Tweet
  include Mongoid::Document

  belongs_to :created_by, class_name: "User", inverse_of: :owner_tweets
  has_and_belongs_to_many :mentioned_users, class_name: "User", inverse_of: nil
end

owner = User.create
user1 = User.create
user2 = User.create

tweet = Tweet.create( owner_id: owner.id )
tweet.mentioned_users << user1
tweet.mentioned_users << user2

tweet
=> #<Tweet _id: 52da59abd9a0d1fda4000003, created_by_id: "52da5985d9a0d1fda4000001", mentioned_user_ids: ["52da59a2d9a0d1fda4000002", "52da59a2d9a0d1fda4000003"]> 
owner
=> #<User _id: 52da5985d9a0d1fda4000001, >

For more information: http://mongoid.org/en/mongoid/docs/relations.html

Upvotes: 1

Related Questions