Mongoid - возможно ли встраивать_другой, в какую модель встраивается_в? - PullRequest
1 голос
/ 06 марта 2012

Возможно ли иметь следующий вид отношений:

Пользователь:

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

Задача:

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

но когда я пробую это в rails console, я получил следующее:

>  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'

такое определение невозможно, или что-то не так?

1 Ответ

2 голосов
/ 06 марта 2012

Звучит так, будто вы хотите хранить отдельные Задачи внутри Пользователей и Пользователя-отправителя внутри этой задачи.

В этом случае, то, что вы хотите сделать, чтобы проверить это в консоли 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
...