revert Optimize to avoid 502 errors caused by multiple queries
This commit is contained in:
chiu 2026-05-12 11:01:37 +00:00
parent adbd76ed30
commit d65daa92d8
1 changed files with 5 additions and 58 deletions

View File

@ -31,17 +31,8 @@ wb.add_worksheet(name: sheet_name) do |sheet|
seminar_signup_fields = @seminar.seminar_signup_fields.where(:disabled=>false).asc(:sort_number, :_id).to_a
# 確定每個欄位是否需要多語言輸出
field_multilang = {}
seminar_signup_fields.each do |rf|
# 檢查 option_list 是否有多個語言,或欄位本身標記為多語言
has_multiple_langs = rf.option_list && rf.option_list.values.first && rf.option_list.values.first.is_a?(Hash) && rf.option_list.values.first.keys.size > 1
field_multilang[rf.id] = rf.can_muti_lang_input? || has_multiple_langs
end
# 標題列
seminar_signup_fields.each do |rf|
if field_multilang[rf.id]
if rf.can_muti_lang_input?
@site_in_use_locales.each do |l|
row << rf.title + " (#{t(l.to_s)})"
end
@ -61,15 +52,6 @@ wb.add_worksheet(name: sheet_name) do |sheet|
wrap_text_style = wb.styles.add_style({:alignment => {:horizontal => :center, :vertical => :center, :wrap_text => true}})
types = [:time]
styles = [date_time_style]
# 優化:一次性載入所有資料,避免 N+1 查詢
signup_ids = @seminar_signups.map(&:id)
signup_values_index = {}
SeminarSignupValue.where(:seminar_signup_id.in => signup_ids).each do |sv|
key = "#{sv.seminar_signup_id}_#{sv.seminar_signup_field_id}"
signup_values_index[key] = sv
end
@seminar_signups.each_with_index do |signup, i|
row2 = []
row2 << signup.created_at
@ -83,47 +65,12 @@ wb.add_worksheet(name: sheet_name) do |sheet|
row2 << "#{signup[:email]} "
row2 << "#{signup.note} "
seminar_signup_fields.each do |rf|
key = "#{signup.id}_#{rf.id}"
signup_value = signup_values_index[key]
# 根據欄位是否需要多語言來輸出
if field_multilang[rf.id]
if rf.can_muti_lang_input?
@site_in_use_locales.each do |l|
if signup_value
# 處理陣列型別的 val
if signup_value.val.is_a?(Array)
# 陣列:對每個元素查詢 option_list 用逗號分隔
display_value = signup_value.val.map { |v| rf.option_list[v.to_s]&.[](l.to_s) || rf.option_list[v.to_s]&.[]('en') }.compact.join(', ') rescue ''
elsif rf.option_list && rf.option_list[signup_value.val.to_s]
# 單個值且有 option_list
display_value = rf.option_list[signup_value.val.to_s][l.to_s] || rf.option_list[signup_value.val.to_s]['en'] rescue ''
else
# 沒有 option_list 直接用 val
display_value = signup_value.val.to_s
end
row2 << display_value
else
row2 << ''
end
row2 << (@seminar.get_attribute_value(rf,signup.id).get_value_by_locale(l) rescue '')
end
else
# 非多語言欄位,只輸出一次
if signup_value
# 處理陣列型別的 val
if signup_value.val.is_a?(Array)
# 陣列:對每個元素查詢 option_list 用逗號分隔
display_value = signup_value.val.map { |v| rf.option_list[v.to_s]&.[]('en') }.compact.join(', ') rescue ''
elsif rf.option_list && rf.option_list[signup_value.val.to_s]
# 單個值且有 option_list
display_value = rf.option_list[signup_value.val.to_s]['en'] rescue ''
else
# 沒有 option_list 直接用 val
display_value = signup_value.val.to_s
end
row2 << display_value
else
row2 << ''
end
row2 << (@seminar.get_attribute_value(rf,signup.id).get_value_by_locale(I18n.locale) rescue '')
end
end
if i == 0
@ -135,4 +82,4 @@ wb.add_worksheet(name: sheet_name) do |sheet|
sheet.add_row row2 , :types => types, :style => styles
end
end
end