Я хочу вернуться к просмотру пользователей, чей выбор интереса_категории совпадает с моими 100% как минимум по 1 проценту_категории. Если пользователи не совпадают хотя бы в одной категории интереса, их не следует выбирать.
Помимо 100% совпадений, мое представление должно отображаться отсортированным по рейтингу совпадений.
Например, если я выберу 5 элементов интереса_категории, а другой пользователь А получит как минимум 5 из ее элементов интереса_категории, которые равны моим, это совпадение на 100%.
Если у пользователя B есть 4 интереса, которые совпадают с моими, это совпадение 4/5 (80%).
Каждый пользователь редактирует свой профиль с помощью простой формы. Я публикую часть этого здесь:
<%= f.input :interest_category, collection: ['Reading', 'Tech' ,'Food', 'Mindfullness', 'Sports', 'Parenting', 'Yoga'], input_html: { multiple: true }, include_blank: true, include_hidden: false, label: "Select your interest: "%>
Который после выбора первых 3 опций сохраняет в БД следующее:
"[\" Чтение \ ", \" Техника \ ", \" Еда \ "]"
Я начал определять новый метод на моем контроллере Users под названием совпадения , который должен иметь логику сопоставления для выбора совпадающих пользователей.
Может ли кто-нибудь помочь мне понять, как идти дальше и думать об этом?
EDITED
Итак, я смог решить эту проблему, добавив метод на моем контроллере Users и поработав там с IF, сначала определив переменную, которая выдаст мне общие элементы:
join_categories = match_real_categories & user_real_categories
, а затем поэкспериментировать с .length, рассчитав соотношение между общими элементами и элементами соответствия или пользователя:
match_real_categories = match.interest_category.gsub(/[~;:"'<>?#\s\]\\\[]+/, '').split(",")
user_real_categories = @user.interest_category.gsub(/[~;:"'<>?#\s\]\\\[]+/, '').split(",")
join_categories = match_real_categories & user_real_categories
join_length = join_categories.length
if join_categories.length == 0
match_value = 0
elsif match_real_categories.sort == user_real_categories.sort
match_value = 1
else
match_value = join_categories.length.to_f*2 / (user_real_categories.length.to_f + match_real_categories.length.to_f)
end