Querrel упрощает параллельный запрос к нескольким базам данных (потокам) с помощью ActiveRecord, как если бы вы запрашивали одну базу данных.
Добавьте эту строку в Gemfile вашего приложения:
gem 'querrel'
И затем выполните:
$ bundle
Или установите его самостоятельно как:
$ gem install querrel
Вы можете использовать Querrel напрямую через пространство имен верхнего уровня или создав экземпляр:
all_brands = Querrel . query ( Brand . all , on : [ 'db1' , 'db2' , 'db3' ] )
# is the same as
all_brands = Querrel . new ( [ 'db1' , 'db2' , 'db3' ] ) . query ( Brand . all )
Любой из вышеперечисленных вариантов даст вам массив всех объектов Brand из всех заданных баз данных. Записи будут помечены как доступные только для чтения.
query
выдаст блок с переданным в ActiveRecord::Relation
, это позволяет вам выполнять дополнительные операции с результатами перед их объединением, например, вы можете использовать pluck:
all_brand_names = q . query ( Brand . all ) do | s |
s . pluck ( :name )
end
Существует также метод run
, который вместо запуска заранее заданной области и слияния принимает блок, который позволяет вам делать все, что вы хотите, с указанным соединением с базой данных, например:
require 'thread'
all_brands = [ ]
b_s = Mutex . new
all_products = [ ]
p_s = Mutex . new
Querrel . run ( on : dbs ) do | db |
b_s . synchronize { all_brands += Brand . all . to_a }
p_s . synchronize { all_products += Product . all . to_a }
end
Есть три способа указать Querrel, какие базы данных использовать:
Передайте массив сред, например Querrel.new([:customer1, :customer2])
Передайте массив имен баз данных, например Querrel.new(['dbs/customer1.sqlite3', 'dbs/customer2.sqlite3'], db_names: true)
Передайте хеш именованных конфигураций соединения, например:
Querrel . new ( {
one : {
adapter : "sqlite3" ,
database : "test/dbs/test_db_1.sqlite3"
} ,
two : {
adapter : "sqlite3" ,
database : "test/dbs/test_db_2.sqlite3"
}
} )
По умолчанию Querrel будет использовать максимум 20 потоков, но вы можете настроить это с помощью опции :threads
:
q = Querrel . new ( dbs , threads : 50 )
git checkout -b my-new-feature
)git commit -am 'Add some feature'
)git push origin my-new-feature
)