ruby-on-rails - 使用mongoid使用mongodb在消息父级中嵌入消息回复

标签 ruby-on-rails ruby mongodb mongoid

我认为最好的做法是将对特定消息的回复嵌入到该消息中,我正在尝试使用 mongoid 来实现它。这是我的

class Message
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Paranoia 

  field :subject
  field :body
  field :sender_deleted, :type => Boolean, :default => false
  field :recipient_deleted, :type => Boolean, :default => false
  field :read_at, :type => DateTime

  referenced_in :sender, :class_name => "User", :inverse_of => :sender, :foreign_key => 'sender_id'
  referenced_in :recipient, :class_name => "User", :inverse_of => :recipient, :foreign_key => 'recipient_id'

  embeds_many :replies, :class_name => 'Message'
  embedded_in :message, :inverse_of => :replies

这是我尝试定义消息及其回复关系的部分:

  embeds_many :replies, :class_name => 'Message'
  embedded_in :message, :inverse_of => :replies

它对我不起作用,我不知道为什么,知道我怎么能做这样的事情吗?

最佳答案

这是否是最佳实践是一个备受争议的话题。例如,您必须注意对象大小限制(目前为 4 MB,但很快就会增加)。

关于你的问题: 我建议你改变

  embeds_many :replies, :class_name => 'Message'
  embedded_in :message, :inverse_of => :replies

  embeds_many :replies, :class_name => 'Message'
  referenced_in :message

而且您还必须手动指定这两个连接(这应该不是问题,因为它们可能无论如何都是不可变的)。

irb(main):002:0> msg1 = Message.new :subject => 'new question'
=> #<Message _id: 4cc7699f457601d7e8000001, created_at: nil, body: nil, updated_at: nil, subject: "new question", read_at: nil, sender_deleted: false, message_id: nil, recipient_deleted: false>
irb(main):003:0> msg2 = Message.new :subject => 'first comment'
=> #<Message _id: 4cc769b6457601d7e8000002, created_at: nil, body: nil, updated_at: nil, subject: "first comment", read_at: nil, sender_deleted: false, message_id: nil, recipient_deleted: false>
irb(main):005:0> msg2.message = msg1
=> #<Message _id: 4cc7699f457601d7e8000001, created_at: nil, body: nil, updated_at: nil, subject: "new question", read_at: nil, sender_deleted: false, message_id: nil, recipient_deleted: false>
irb(main):007:0> msg1.replies << msg2
=> [#<Message _id: 4cc769b6457601d7e8000002, created_at: nil, body: nil, updated_at: nil, subject: "first comment", read_at: nil, sender_deleted: false, message_id: BSON::ObjectId('4cc7699f457601d7e8000001'), recipient_deleted: false>]
irb(main):008:0> msg1.save
=> true

关于ruby-on-rails - 使用mongoid使用mongodb在消息父级中嵌入消息回复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4015558/

相关文章:

ruby - tk 事件支出?

ruby - 使用 ruby​​ 和 selenium 时如何使用 headless chrome 启用远程调试?

mongodb - 使用 Robomongo 连接到 Windows Azure VM 上的 mongoDB 服务器

node.js - Gridfs-stream、多方中间件的编码问题

mongodb - 如何从 mongodb 中的远程服务器复制受密码保护的数据库?

ruby-on-rails - 从父 Controller 访问子命名空间 Controller

ruby-on-rails - Rails 4.2 集成测试 - 有什么方法可以重用测试代码吗?

ruby-on-rails - RoR 在刷新时重新加载内容是如何工作的?

ruby-on-rails - rspec 不适用于设计用户身份验证

ruby-on-rails - 用于添加现场教程的 Rails gem