ganncamp
(G Ann Campbell)
5 مارس 2025، 7:08م
1
لدي استعلام مستكشف البيانات (Data Explorer ) يقبل معلمة ‘group_name’
أود أتمتة تشغيله لكل مجموعة ذات صلة وإرسال النتائج للمجموعة مرة واحدة في الأسبوع.
لكنني لا أستطيع على الإطلاق معرفة الصيغة التي يجب استخدامها للمعلمة. إليك ما أراه لذلك في أتمتة جديدة تمامًا:
أجد هذا… غير مفيد.
لقد جربت عدة صيغ هنا. عندما لا أحصل على خطأ من محاولاتي (الموجودة في سجلات الأخطاء)، يبدو أنني لا أحصل على أي شيء على الإطلاق.
إذا استخدمت استعلامًا بدون معلمات، فإنه يعمل بسرعة البرق. كيف أجعلها تعمل للاستعلامات التي تحتاج إلى معلمات؟
إعجابَين (2)
يمكنني أيضًا تكرار المشكلة.
في مثالك، لنفترض أنك تريد التحقق من مجموعات المشرفين والمديرين، يجب أن يكون لديك:
مفتاح: group_name
قيمة: moderators,admins
أمور تقنية للمساعدة، لا تهتم بي.
حاولت الفهم بالنظر إلى الكود، وأعتقد أن هناك مشكلة هنا:
result = DataExplorer.run_query(query, params)
query.update!(last_run_at: Time.now)
return [] if opts[:skip_empty] && result[:pg_result].values.empty?
table =
ResultToMarkdown.convert(result[:pg_result], render_url_columns: opts[:render_url_columns])
build_report_pms(query, table, recipients, attach_csv: opts[:attach_csv], result:)
end
def self.generate_post(query_id, query_params, opts = {})
query = DiscourseDataExplorer::Query.find(query_id)
return {} if !query
params = params_to_hash(query_params)
result = DataExplorer.run_query(query, params)
query.update!(last_run_at: Time.now)
return {} if opts[:skip_empty] && result[:pg_result].values.empty?
build_report_post(query, table, attach_csv: opts[:attach_csv], result:)
end
def self.params_to_hash(query_params)
params = JSON.parse(query_params)
params.map { |p| p.is_a?(Hash) ? [p["key"], p["value"]] : p }.to_h
end
def self.build_report_pms(query, table = "", targets = [], attach_csv: false, result: nil)
pms = []
upload = create_csv_upload(query, result) if attach_csv
targets.each do |target|
name = target[0]
pm_type = "target_#{target[1]}s"
pm = {}
pm["title"] = I18n.t(
يتم تحويل المعلمات قبل استدعاء run_query.
لنفترض أن لديك هذه القيمة الأصلية:
[{"key":"group_names","value":"admins,moderators"}]
ستكون القيمة المحولة:
[{"key"=>"group_names", "value"=>"admins,moderators"}=>nil]
def self.run_query(query, req_params = {}, opts = {})
# Safety checks
# see test 'doesn't allow you to modify the database #2'
if query.sql =~ /;/
err = ValidationError.new(I18n.t("js.errors.explorer.no_semicolons"))
return { error: err, duration_nanos: 0 }
end
query_args = {}
begin
query_args = query.cast_params req_params
rescue ValidationError => e
return { error: e, duration_nanos: 0 }
end
time_start, time_end, explain, err, result = nil
begin
ActiveRecord::Base.connection.transaction do
# Setting transaction to read only prevents shoot-in-foot actions like SELECT FOR UPDATE
# see test 'doesn't allow you to modify the database #1'
DB.exec "SET TRANSACTION READ ONLY"
ومع ذلك، يبدو أن cast_params يتوقع {"group_names"=>"admins,moderators"}
حاولت اختبار هذا التغيير البسيط، وعملت المعلمات.
def self.params_to_hash(query_params)
params = JSON.parse(query_params)
params_hash = {}
params.each do |param|
key = param["key"]
value = param["value"]
params_hash[key] = value
end
params_hash
end
7 إعجابات
sam
(Sam Saffron)
6 مارس 2025، 10:03م
3
شكراً جزيلاً على تصحيح الأخطاء هنا سنلقي نظرة على هذا في الأسبوع القادم.
5 إعجابات
ted
(Ted Johansson)
13 مارس 2025، 7:47ص
8
هذا استكشاف رائع للكهوف يا @Arkshine !
أنا أبحث في هذا الآن. عندما قرأت الكود الأصلي، انطباعي هو أنه يتوقع أن تكون المعلمات مصفوفة من المصفوفات، لذا أنا متردد قليلاً في التخلص من الأشياء الموجودة. سأحاول معرفة متى قد يحدث هذا.
سأنشر هنا عندما أجد شيئًا.
إعجاب واحد (1)
ted
(Ted Johansson)
13 مارس 2025، 10:01ص
9
كانت هناك بالفعل علة هنا، وبفضل تحقيق @Arkshine جزئيًا، كان من السهل نسبيًا إصلاحها:
main ← fix/report-generator-parameters
opened 09:29AM - 13 Mar 25 UTC
### What is the problem?
When setting up an automation to create a DM or a po… st with a report on a recurring basis, and using a Data Explorer query that has parameters, we encounter an error.
### Why is this happening?
The `.params_to_hash` currently expects an array of arrays for the parameters, e.g.:
```ruby
[["group_name", "admins"]]
```
but in reality they seem to be arrays of hashes:
```ruby
[{ "key" => "group_name", "value" => "admins" }]
```
### How come we only found out now?
We do have tests for the report generator, and we do pass query parameters to it, but 1) we hard-code the parameters as an array of arrays and 2) the parameters aren't in the query used as a fixture.
### How does this fix it?
This change makes `ReportGenerator.params_to_hash` work with arrays of hashes. It also preserves the ability to work with nested arrays in case this is used somewhere else.
تم دمج هذا بالفعل، لذلك بمجرد نشر موقعك، يجب أن يتم رفع الحظر عنك @ganncamp .
إذا فهمت بشكل صحيح، فأنت تريد أتمتة تكون عبارة عن تعيين واحد لواحد بين مجموعة وتقريرها؟ (أي أن group_a تتلقى تقريرًا ببيانات group_a، وما إلى ذلك)
لا يوجد (حاليًا) اتصال بين قائمة المستلمين ومعلمات التقرير، لذلك لتحقيق ذلك ستحتاج إلى إعداد أتمتة واحدة لكل مجموعة. في هذه الحالة، قد ترغب في تغيير المعلمة إلى group_id.
3 إعجابات
ganncamp
(G Ann Campbell)
13 مارس 2025، 11:51ص
11
أخبار رائعة يا @ted !
نعم، كانت القدرة على المرور على كل مجموعة (foreach) هي طلبي التالي
3 إعجابات
ted
(Ted Johansson)
14 مارس 2025، 2:19ص
12
يبدو هذا بالفعل شيئًا مفيدًا، خاصة للمواقع التي تحتوي على الكثير والكثير من المجموعات. سأسجل الطلب، لكن لا يمكنني تحديد موعد لتنفيذه. :أيدٍ مطوية:
3 إعجابات
j.jaffeux
(Joffrey Jaffeux)
تم إغلاقه في
17 مارس 2025، 10:09ص
14
تم إغلاق هذا الموضوع تلقائيًا بعد 3 أيام من آخر رد. لم يُسمح بردود جديدة بعد الآن.