Встроенная ссылка на mongoid - PullRequest
0 голосов
/ 14 февраля 2012

Моя User модель has_and_belongs_to_many :conversations.

Модель Conversation embeds_many :messages.

Модель Message должна иметь sender и recipient.

Мне не удалось найти referenced_in в документации Mongoid .

Как назначить пользователей в сообщении? Я пытался следовать чему-то похожему на эту реализацию , но продолжал получать BSON::InvalidDocument: Cannot serialize an object of class Mongoid::Relations::Referenced::In into BSON.

Ноябрь 2013 Обновление : reference_in больше не работает с Mongoid 3.0? Изменено на belongs_to и похоже, работает так же.

1 Ответ

3 голосов
/ 15 февраля 2012

Как оказалось, моя структура Message, ссылающаяся на User, была подходящей, и ошибка сериализации была связана с привязкой пользователей к беседе.Вот моя структура и шаги создания.Я благодарен за любые отзывы о лучших практиках, спасибо.

class User
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Paranoia

  has_and_belongs_to_many :conversations
end
class Conversation
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Paranoia

  has_and_belongs_to_many :users
  embeds_many :messages
end
class Message
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Paranoia

  embedded_in :conversation
  embeds_one :sender, class_name: 'User'
  embeds_one :recipient, class_name: 'User'

  field :content
  field :read_at, type: DateTime
  field :sender_deleted, type: Boolean, default: false
  field :recipient_deleted, type: Boolean, default: false

  belongs_to :sender, class_name: "User", inverse_of: :sender, foreign_key: 'sender_id'
  belongs_to :recipient, class_name: "User", inverse_of: :recipient, foreign_key: 'recipient_id'
end

Где прежде, чем я пытался @conversation.build(user_ids: [@user_one,@user_two]), подходящий способ - @conversation.users.concat([@user_one,@user_two]).Тогда вы можете просто @conversation.messages.build(sender: @user_one, recipient: @user_two).

...