如何在两个数据库之间加载?

时间:2018-03-01 17:16:30

标签: ruby-on-rails rails-activerecord

我必须与遗留数据库中的某些数据进行交互,而这些数据不属于我的应用程序。我需要从两个来源加载数据而不会导致n + 1个查询。

thing.rb

class Thing
  # Lives in my applications DB
  belongs_to :other_thing
end

other_thing.rb

class OtherThing
  establish_connection(:other_database)
  has_many :things
end

Thing.includes(:other_thing) 因为other_things处于不同的架构中,所以不起作用。

Thing.all.map(&:other_thing) 可以工作,但会生成n + 1个查询。

到目前为止,这是我提出的最佳选择:

things = Thing.all
other_things = OtherThing.find(things.map(&:other_thing_id))
things = things.map{|t| t.other_thing = other_things.select{|ot| ot.id == t.other_thing_id}.first; t }

这只会产生2个查询,但我认为必须有更好的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以使用preload来执行此操作:

Think.preload(:other_thing)

the documentation所说的 <{1}}的工作方式相反。