mongo和postgres模型之间的关联

时间:2018-04-11 04:32:11

标签: ruby-on-rails mongodb postgresql ruby-on-rails-5.1

我在一个应用程序中有两个数据库

  1. 的Postgres
  2. MongoDB的
  3. 除一个型号外,所有型号均在Postgres 型号名称Message位于MongoDB中,如下所示

    1. message.rb - MongoDB

      class Message
        include Mongoid::Document
      
        field :content,         type: String
        field :user_id,         type: Integer
      end
      
    2. user.rb - Postgres

      class User < ApplicationRecord
      end
      
    3. 现在我想将user模型与message模型相关联,以执行预加载。

      如果我写belongs_to :user,然后执行Message.last.user,则会出现以下错误

      NoMethodError (undefined method `_association' for []:Array)
      

      有没有解决这个问题?

1 个答案:

答案 0 :(得分:2)

你无法真正建立这样的跨数据库关联。但是,根据您需要的关联程度,可能很容易伪造它:

class Message
  include Mongoid::Document

  field :content,         type: String
  field :user_id,         type: Integer

  def user
    User.find(user_id)
  end
end

如果您不确定user_id s的有效性,那么:

def user
  User.find_by(id: user_id)
end

可能会更好,但您必须为nil some_message.user的{​​{1}}做好准备。您可能希望在user_id上添加一些验证,以确保它确实是id的{​​{1}}。

当然,这个chicanry不会帮助您将用户删除传播到MongoDB或支持User中的has_many :messages。您必须手动完成这些操作,但User(或after_destroy)钩子和几个简单的手写方法(以及可靠的测试套件)可以填补这些空白。