Ruby on rails 3 Mongoid-是否可以嵌入模型所嵌入的内容?

Ruby on rails 3 Mongoid-是否可以嵌入模型所嵌入的内容?,ruby-on-rails-3,mongodb,mongoid,Ruby On Rails 3,Mongodb,Mongoid,是否可能存在以下类型的关系: 用户: 任务: 但是,当我在rails控制台中尝试它时,我得到了以下结果: > u1 = User.where(...).first > u2 = User.where(...).first > task = Task.new > task.user = u1 > task.sender = u2 NoMethodError: undefined method `first' for #<Task:0x47631bc9

是否可能存在以下类型的关系:

用户:

任务:

但是,当我在
rails控制台中尝试它时,我得到了以下结果:

>  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'
>u1=User.where(…).first
>u2=用户。其中(…)。第一个
>task=task.new
>task.user=u1
>task.sender=u2
NoMethodError:未定义的方法“first”#
来自org/jruby/RubyKernel.java:227:in'method\u missing'
来自/Users/larry/.rvm/gems/jruby-1.6。7@entercamp/gems/mongoid-2.4.6/lib/mongoid/attributes.rb:166:in'method_missing'
来自/Users/larry/.rvm/gems/jruby-1.6。7@entercamp/gems/mongoid-2.4.6/lib/mongoid/relations/embedded/many.rb:292:in'substitute'
来自org/jruby/RubyProc.java:270:in'call'
来自org/jruby/RubyProc.java:220:in'call'
来自/Users/larry/.rvm/gems/jruby-1.6。7@entercamp/gems/mongoid-2.4.6/lib/mongoid/relations/embedded/atomic.rb:61:in“原子地”
来自org/jruby/RubyProc.java:270:in'call'
来自org/jruby/RubyProc.java:220:in'call'
来自/Users/larry/.rvm/gems/jruby-1.6。7@entercamp/gems/mongoid-2.4.6/lib/mongoid/relations/embedded/atomic.rb:82:in'count_executions'
来自/Users/larry/.rvm/gems/jruby-1.6。7@entercamp/gems/mongoid-2.4.6/lib/mongoid/relations/embedded/atomic.rb:60:in“原子地”
来自/Users/larry/.rvm/gems/jruby-1.6。7@entercamp/gems/mongoid-2.4.6/lib/mongoid/relations/embedded/many.rb:290:in'substitute'
来自org/jruby/RubyKernel.java:1787:in'tap'
来自/Users/larry/.rvm/gems/jruby-1.6。7@entercamp/gems/mongoid-2.4.6/lib/mongoid/relations/embedded/many.rb:283:in'substitute'
来自/Users/larry/.rvm/gems/jruby-1.6。7@entercamp/gems/mongoid-2.4.6/lib/mongoid/relations/accessors.rb:128:in'tasks='10〕
来自org/jruby/RubyProc.java:270:in'call'
来自org/jruby/RubyKernel.java:2080:in'send'

这种定义是不可能的,还是出现了其他问题?

听起来您希望将单个任务存储在用户中,而发送方用户存储在该任务中

在这种情况下,要在rails控制台中测试这一点,您需要执行以下操作:

>  assignee = User.where(...).first
>  assigner = User.where(...).first
>  task = Task.new
>  task.sender = assigner
>  task.save
>  assignee.task = task
>  assignee.save
对吧??在这种情况下,我认为您的类可能如下所示:

任务

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

class User
  embeds_many :tasks
  embedded_in :task
end

为什么不在任务文档中嵌入两个用户,一个为发件人,一个为用户?添加了一个具有您的层次结构的答案,让我知道您是否正在寻找。如果
embedded_in:Task
添加到
user
模型,然后用户无法直接访问,因为它嵌入了另一个模型中。发件人不能,但分配可以。当然,根据您的喜好调整。您的示例不起作用的原因是没有定义关系的另一面。查看mongoid文档关系部分中的“反向”。
class Task
  embedded_in :assignee, :class_name => "User"
  embeds_one :assigner, :class_name => "User"
end
class User
  embeds_many :tasks
  embedded_in :task
end