يجعل 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 )
سيعطيك أي مما سبق مصفوفة من جميع كائنات العلامة التجارية من جميع قواعد البيانات المحددة. سيتم وضع علامة على السجلات للقراءة فقط.
سيؤدي 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
)