Почему RailsAdmin так медленно загружает мой вид редактирования?

#ruby-on-rails #rails-admin

#ruby-on-rails #rails-администратор

Вопрос:

Я создаю интерфейс администратора для своего веб-сайта Rails с помощью gem rails_admin. Моя проблема в том, что когда я пытаюсь отредактировать FirstJob модель, загрузка представления занимает более 15 секунд.

После некоторого тестирования кажется, что поле, которое вызывает это огромное время загрузки, study_domains потому что, когда я удаляю его из действия редактирования, время загрузки резко уменьшается до секунды или около того.

Чтобы дать немного контекста, в моем приложении у меня есть несколько заданий, и каждое задание может иметь несколько областей изучения через таблицу с именем skilltags , которая является мостом между разными study_domain и field_of_study разными объектами, вот связь:

first_job.rb, internship.rb amp; student_job.rb

 belongs_to :company
belongs_to :company_logo, class_name: "Document", optional: true

has_many :skilltags, :dependent => :destroy
has_many :hard_skills, :through => :skilltags
has_many :study_domains, -> { distinct }, :through => :skilltags
has_many :field_of_studies, :through => :skilltags
has_many :favourites, :dependent => :destroy
has_many :candidacies
has_many :users_candidacy, class_name: 'User', :through => :candidacies, source: :user
has_many :users_favourite, class_name: 'User', :through => :favourites, source: :user
has_many :documents, :dependent => :destroy
has_one :address, :dependent => :destroy
  

company.rb

 has_many :first_jobs, -> {where(deleted: false)}
has_many :internships, -> {where(deleted: false)}
has_many :student_jobs, -> {where(deleted: false)}
has_many :alerts
has_many :documents, :dependent => :destroy
has_many :articles
has_many :testimonies
has_one :profile
has_one :user, :through => :profile
has_one :address

has_many :companies, class_name: "Company", foreign_key: "parent_id"
belongs_to :parent, class_name: "Company", optional: true

belongs_to :logo, class_name: "Document", optional: true
belongs_to :main_image, class_name: "Document", optional: true
belongs_to :banner_image, class_name: "Document", optional: true

serialize :list_videos, Array
serialize :featured_characteristics, Array
serialize :featured_pictures, Array
  

skilltag.rb

 belongs_to :user, optional: true
belongs_to :soft_skill, optional: true
belongs_to :hard_skill, optional: true
belongs_to :first_job, optional: true
belongs_to :internship, optional: true
belongs_to :student_job, optional: true
belongs_to :study_domain, optional: true
belongs_to :field_of_study, optional: true
  

study_domain.rb

 has_many :field_of_studies
has_many :skilltags, :dependent => :destroy
has_many :first_jobs, through: :skilltags
has_many :internships, through: :skilltags
  

soft_skill.rb

 has_one :skilltag
  

hard_skill.rb

 has_many :skilltags
has_many :users, :through => :skilltags
has_many :first_jobs, :through => :skilltags
  

field_of_study.rb

 has_many :experiences
belongs_to :study_domain, optional: true
has_many :skilltags
has_many :first_jobs, :through => :skilltags
has_many :internships, :through => :skilltags
  

experience.rb

 belongs_to :school, optional: true
belongs_to :campus, optional: true
belongs_to :field_of_study, optional: true
has_many :experience_tags, :dependent => :destroy
has_many :years, through: :experience_tags
  

rails_admin.rb

 edit do
    field :company do
        inline_add false
    end
    field :title
    field :start_date
    field :description, :ck_editor
    field :active
    field :approved
    field :active_until
    field :searched_profile, :ck_editor
    field :specialization
    field :we_offer, :ck_editor
    field :motivation_letter
    field :application_email
    field :company_name
    field :company_size, :enum do
        enum do
            ApplicationController.helpers.company_size_collection.map { |size|
                [size[:en], size[:name]]
            }
        end
    end
    field :company_description, :ck_editor
    field :application_url, :string
    field :company_logo
    field :video_url
    field :study_domains do
        inline_add false
    end
    field :field_of_studies do
        inline_add false
    end
    field :users_candidacy do
        inline_add false
    end
    field :address
    field :sector, :enum do
        enum do
            ApplicationController.helpers.sector_collection.map { |sector|
                [sector[:en], sector[:name]]
            }
        end
    end
    field :department, :enum do
        enum do
            ApplicationController.helpers.department_collection.map { |department|
                [department[:en], department[:name]]
            }
        end
    end
    field :contract_type, :enum do
        enum do
            ApplicationController.helpers.contract_type_collection.map { |contract_type|
                [contract_type[:en], contract_type[:name]]
            }
        end
    end
    field :regime, :enum do
        enum do
            ApplicationController.helpers.regime_collection.map { |regime|
                [regime[:en], regime[:name]]
            }
        end
    end
    field :study_level, :enum do
        enum do
            ApplicationController.helpers.study_level_collection.map { |study_level|
                [study_level[:en], study_level[:name]]
            }
        end
    end
    field :language, :enum do
        enum do
            ApplicationController.helpers.primary_language_collection.map { |language|
                [language[:en], language[:value]]
            }
        end
    end
end
  

Я не знаю, достаточно ли здесь подробностей, но если у вас есть какие-либо вопросы, я обновлю свой вопрос дополнительной информацией.

Комментарии:

1. Вывод SQL выглядит слишком маленьким, попробуйте установить уровень журнала на debug, чтобы увидеть ВСЕ запросы.

2. @GuillermoSiliceoTrueba Спасибо за ваш комментарий, я добавил все логи

Ответ №1:

Глядя на результат, кажется, что основная проблема заключается в стажировках, на выполнение SQL у меня уходит почти 9 секунд, и я уверен, что время рендеринга составляет половину вашего просмотра. Не могли бы вы обновить свой вопрос с остальными ассоциациями, связанными с этим представлением? стажировки, first_jobs, опыт, теги навыков.

Предполагается, что Rails admin ограничивает количество записей в этих form_filtering_multiselects, но, похоже, он этого не делает.

Также вы можете изучить возможность разделения этого представления на несколько вкладок, добавляя новые пользовательские действия администратора rails.

Обновить

Я добавил журналы, которые вы опубликовали ранее, к этой сути в качестве ссылки.

Из журналов самые дорогие запросы — это запросы на получение стажировок, но вы говорите, что редактируете модель first_job, и в этой модели нет ассоциаций стажировок. Спасибо за сотрудничество, но не могли бы вы также опубликовать rails_admin для модели FirstJob, потому что я не могу понять, почему и как загружаются эти стажировки.

Комментарии:

1. Спасибо за ваш ответ. К сожалению, я превысил лимит символов для своего вопроса. Но чтобы дать вам немного больше деталей, у нас есть companies которые получают несколько first_jobs , internships и student_jobs . Каждое задание может быть связано с soft_skills , hard_skills , field_of_studies и study_domains через skilltag, который является связующим звеном между этими идентификаторами. В этом примере я пытаюсь отредактировать first_job , загружены ли эти стажировки из-за companies / ìnternships ассоциации?

2. Я бы так подумал. Но вы можете удалить журналы, чтобы опубликовать все ассоциации, я просто хочу быть полностью уверенным в том, как они выглядят, чтобы предложить, как разделить их редакцию в разных представлениях или возможную оптимизацию

3. Я отредактировал свой вопрос, дайте мне знать, если есть недостающая ассоциация, которая вам понадобится

4. Я думаю, что стажировки загружаются из-за has_many :internships, through: :skilltags включения study_domain.rb . Когда Rails Admin загружает все study_domains, чтобы я мог добавлять и удалять некоторые из них в свой first_job, он также загружает все стажировки, связанные с study_domain, возможно, я прав?

5. Возможно, вы на верном пути, но не нужно загружать ВСЕ ассоциации StudyDomain, чтобы отобразить их при первом редактировании задания, если только отображаемое имя study_domain не зависит от стажировок. Также может быть, что study_domains отображаются как вложенная форма, это происходит с accept_nested_attributes.