【发布时间】:2021-05-18 11:13:48
【问题描述】:
我们的 rails 应用有一个主数据库和一个副本数据库。我们已经定义了一个接收块的方法,并且在块内部时,将对副本进行查询,如下所示:
on_replica do
@my_things = MyModel.where(my_attr: "my value").to_a
end
这在大多数情况下都很好用,但如果你没有真正在块中执行查询,它就不起作用:
on_replica do
@my_things = MyModel.where(my_attr: "my value")
end
# this will run its query against the primary DB
@my_things.to_a
我真的很想能够定义一个范围(或类似范围的东西),以便在方法链中超过该点发生的任何查询都发生在副本上:
@my_things = MyModel.where(my_attr: "my value").eventually_on_replica
# this runs its query against the replica DB:
@my_things.to_a
是否可以使用现有的on_replica 方法定义一个可以以这种方式工作的eventually_on_replica 方法?如果MyModel.eventually_on_replica.where(my_attr: "my value") 也有效,则加分。
【问题讨论】:
-
这应该如何表现?
on_replica { query = MyModel.where(....) }; on_primary { query = query.where(....) }; query.to_a-- 现在这是一组矛盾的要求:) -
如果您展示了当前如何定义
on_replica可能会有所帮助。 AFAIK,这种方法基本上是ActiveRecord::Base.connected_to的包装,但我认为它以您描述的方式工作是不合逻辑/不可能的。 -
但是,我也不认为这是必要/可取的!...为什么要/需要指定连接,在上下文之外连接所在的位置居然成立了??如果需要在副本数据库上运行查询,那么为什么不能在查询时指定呢?
-
@TomLord 我们没有
on_primary方法,也没有一个用例。也许我在这里两次使用名称on_replica时犯了一个错误。我提到的第一个已经存在;我不需要帮助来写它。我需要帮助的地方是写第二个,它就像一个范围。我会更新问题。 -
@TomLord 你问“为什么不能在查询时指定” - 因为规范发生在控制器中,而查询发生在视图中。如果可能的话,我们不能只调用
to_a,因为我们想使用will_paginate。
标签: ruby-on-rails rails-activerecord database-replication