#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.