我在一个应用程序中有两个数据库
除一个型号外,所有型号均在Postgres
型号名称Message
位于MongoDB
中,如下所示
message.rb
- MongoDB
class Message
include Mongoid::Document
field :content, type: String
field :user_id, type: Integer
end
user.rb
- Postgres
class User < ApplicationRecord
end
现在我想将user
模型与message
模型相关联,以执行预加载。
如果我写belongs_to :user
,然后执行Message.last.user
,则会出现以下错误
NoMethodError (undefined method `_association' for []:Array)
有没有解决这个问题?
答案 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
)钩子和几个简单的手写方法(以及可靠的测试套件)可以填补这些空白。