larryzhao
larryzhao

Reputation: 3213

Mongoid - Is it possible to embeds_one what the model is embedded_in?

Is it possible to have the following kind of relationship:

User:

class User
  include Mongoid::Document
  include Mongoid::Paperclip
  include Mongoid::Timestamps

  store_in :users
  belongs_to :team
  field :full_name,   :type => String
  field :email,       :type => String

  attr_accessible :full_name, 

end

Task:

class Task
  include Mongoid::Document
  include Mongoid::Timestamps

  embedded_in :user
  embeds_one :sender, :class_name => "User"

  field :text,        :type => String
  field :due_time,    :type => DateTime
  field :completed,   :type => Boolean,  :default => false

  attr_accessible :text, :due_time
end

but when I try it out in the rails console, I got the following:

>  u1 = User.where(...).first
>  u2 = User.where(...).first
>  task = Task.new
>  task.user = u1
>  task.sender = u2

NoMethodError: undefined method `first' for #<Task:0x47631bc9>
        from org/jruby/RubyKernel.java:227:in `method_missing'
        from /Users/larry/.rvm/gems/jruby-1.6.7@entercamp/gems/mongoid-2.4.6/lib/mongoid/attributes.rb:166:in `method_missing'
        from /Users/larry/.rvm/gems/jruby-1.6.7@entercamp/gems/mongoid-2.4.6/lib/mongoid/relations/embedded/many.rb:292:in `substitute'
        from org/jruby/RubyProc.java:270:in `call'
        from org/jruby/RubyProc.java:220:in `call'
        from /Users/larry/.rvm/gems/jruby-1.6.7@entercamp/gems/mongoid-2.4.6/lib/mongoid/relations/embedded/atomic.rb:61:in `atomically'
        from org/jruby/RubyProc.java:270:in `call'
        from org/jruby/RubyProc.java:220:in `call'
        from /Users/larry/.rvm/gems/jruby-1.6.7@entercamp/gems/mongoid-2.4.6/lib/mongoid/relations/embedded/atomic.rb:82:in `count_executions'
        from /Users/larry/.rvm/gems/jruby-1.6.7@entercamp/gems/mongoid-2.4.6/lib/mongoid/relations/embedded/atomic.rb:60:in `atomically'
        from /Users/larry/.rvm/gems/jruby-1.6.7@entercamp/gems/mongoid-2.4.6/lib/mongoid/relations/embedded/many.rb:290:in `substitute'
        from org/jruby/RubyKernel.java:1787:in `tap'
        from /Users/larry/.rvm/gems/jruby-1.6.7@entercamp/gems/mongoid-2.4.6/lib/mongoid/relations/embedded/many.rb:283:in `substitute'
        from /Users/larry/.rvm/gems/jruby-1.6.7@entercamp/gems/mongoid-2.4.6/lib/mongoid/relations/accessors.rb:128:in `tasks='
        from org/jruby/RubyProc.java:270:in `call'
        from org/jruby/RubyKernel.java:2080:in `send'

is this kind of definition is not possible or there's something else going wrong?

Upvotes: 1

Views: 1876

Answers (1)

Tyler Brock
Tyler Brock

Reputation: 30136

It sounds like you want to store individual Tasks inside of Users and the sender User inside of that task.

In which case, what you want to do to test this in the rails console would be:

>  assignee = User.where(...).first
>  assigner = User.where(...).first
>  task = Task.new
>  task.sender = assigner
>  task.save
>  assignee.task = task
>  assignee.save

Right? In that case I think your classes would probably look like this:

Task

class Task
  embedded_in :assignee, :class_name => "User"
  embeds_one :assigner, :class_name => "User"
end

User

class User
  embeds_many :tasks
  embedded_in :task
end

Upvotes: 2

Related Questions