Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Save user metrics in db #47

Merged
merged 28 commits into from
Jul 22, 2024
Merged

Save user metrics in db #47

merged 28 commits into from
Jul 22, 2024

Conversation

daronenko
Copy link
Collaborator

No description provided.

@daronenko daronenko added the enhancement New feature or request label Jul 18, 2024
@daronenko daronenko self-assigned this Jul 18, 2024
@daronenko daronenko linked an issue Jul 18, 2024 that may be closed by this pull request
@daronenko
Copy link
Collaborator Author

daronenko commented Jul 18, 2024

Пример использования модуля SocialMetrics:

posts = [
  {
    id: 1,
    likes: [4, 2, 18, 16, 20],  # users' id
    comments: [1, 4, 18]        # users' id
  },
  {
    id: 2,
    likes: [2, 18, 5, 9, 12, 6, 10, 3],  # users' id
    comments: [6, 2, 3, 1, 4, 5]         # users' id
  },
  {
    id: 3,
    likes: [1, 4, 6],   # users' id
    comments: [19, 15]  # users' id
  }
]

friends = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]  # users' id
ctx = SocialMetrics::Context.new(user)

active_friends, inactive_friends = SocialMetrics.active_friends(ctx)

average_likes = SocialMetrics.average_likes(ctx)
target_likes = SocialMetrics.target_likes(ctx)

average_comments = SocialMetrics.average_comments(ctx)
target_comments = SocialMetrics.target_comments(ctx)

comments_likes_ratio = SocialMetrics.comments_likes_ratio(ctx)
target_comments_likes_ratio = SocialMetrics.target_comments_likes_ratio(ctx)

audience_score = SocialMetrics.audience_score(ctx, active_friends)

post_metrics = SocialMetrics.post_metrics(ctx)
average_engagement_score = SocialMetrics.average_engagement_score(post_metrics)

@daronenko daronenko marked this pull request as draft July 18, 2024 16:27
@daronenko daronenko marked this pull request as ready for review July 21, 2024 16:58
@daronenko daronenko requested a review from mikeGEINE July 21, 2024 17:16
Copy link
Collaborator

@mikeGEINE mikeGEINE left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Обсудили изменения на созвоне

Comment on lines 19 to 25
def active_friends
relationships.where(is_active: true)
end

def inactive_friends
relationships.where(is_active: false)
end
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Функция вернёт relationships, а название функции говорит о friends. Функция, исходя из названия, должна возвращать именно друзей.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Подход с написанием собственной функции рабочий, но вообще не единственный. Можно объявлять отношения между моделями с фильтрами. К примеру:

class User < ApplicationRecord
  has_many :relationships
  has_many :friends, through: :relationships
  has_many :active_relationships, -> { where is_active: true }, class_name: 'Relationship'
  has_many :active_friends, through: :active_relationships, class_name: 'Friend', source: :friend
end

belongs_to :user
belongs_to :friend

validates :is_active, inclusion: { in: [true, false] }
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is_active - не лучшее название в парадигме Rails. Правильнее будет назвать просто active, по аналогии с другими подобными функциями (например, у любой модели есть функция changed?, которая, по сути, так же отражает статус модели, и тоже могла бы быть is_changed).
Кроме того, за счёт того, что это boolean, у модели появляется предикат is_active?. И здесь уже точно правильнее будет просто active?.
Я думаю, что лучше переименовать

Comment on lines 15 to 17
def friends_ids
relationships.pluck(:friend_id)
end
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Мне кажется, эта функция в целом не слишком нужная.

  1. Друзей можно получить через вызов friends, не проходя через relationships, за счёт обявления has_many through.
  2. Как правило удобнее будет использовать список друзей, а не их идентификаторов. Ruby позволяет это делать по сути без штрафов.
  3. Если очень нужны id, то их можно получить из списка друзей в любом месте через friends.map(&:id). Это лучше, чем лишняя функция

Comment on lines 31 to 39
def posts_brief
posts.pluck(:id, :likers, :commentators).map do |post|
{
id: post[0],
likes: JSON.parse(post[1]),
comments: JSON.parse(post[2])
}
end
end
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это точно нужная функция за исключением того, что она парсит JSON?
Точно ли у поста поля likers и commentators должны быть JSON-ами? Название предполагает, что это перечень людей, что поставили лайк или оставили комментарий; может быть тогда это должен быть массив? Такой тип поддерживается нашей базой данных, если верить SO.
Если же это чисто JSON-ы, пришедшие от VK и содержат доп поля, то:

  1. Нужные поля из JSON должны стать полями модели, ненужные отбросить
  2. Для идентификаторов людей, опять же, можно использовать массивы
  3. Если без JSON совсем никак, то, опять же, Postgres позволяет и JSON хранить как тип
    Для справки: https://guides.rubyonrails.org/active_record_postgresql.html

@daronenko daronenko requested a review from mikeGEINE July 22, 2024 16:22
Copy link
Collaborator

@mikeGEINE mikeGEINE left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@daronenko daronenko merged commit 590f9ee into dev Jul 22, 2024
2 checks passed
@mikeGEINE
Copy link
Collaborator

При мёрдже выберите Squash and merge плиз

@daronenko daronenko deleted the feature/save-user-metrics-in-db branch July 22, 2024 16:32
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Save user metrics in db
2 participants