-
Notifications
You must be signed in to change notification settings - Fork 1
Conversation
Пример использования модуля 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) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Обсудили изменения на созвоне
app/models/user.rb
Outdated
def active_friends | ||
relationships.where(is_active: true) | ||
end | ||
|
||
def inactive_friends | ||
relationships.where(is_active: false) | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Функция вернёт relationships, а название функции говорит о friends. Функция, исходя из названия, должна возвращать именно друзей.
There was a problem hiding this comment.
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
app/models/relationship.rb
Outdated
belongs_to :user | ||
belongs_to :friend | ||
|
||
validates :is_active, inclusion: { in: [true, false] } |
There was a problem hiding this comment.
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?
.
Я думаю, что лучше переименовать
app/models/user.rb
Outdated
def friends_ids | ||
relationships.pluck(:friend_id) | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Мне кажется, эта функция в целом не слишком нужная.
- Друзей можно получить через вызов friends, не проходя через relationships, за счёт обявления has_many through.
- Как правило удобнее будет использовать список друзей, а не их идентификаторов. Ruby позволяет это делать по сути без штрафов.
- Если очень нужны id, то их можно получить из списка друзей в любом месте через
friends.map(&:id)
. Это лучше, чем лишняя функция
app/models/user.rb
Outdated
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 |
There was a problem hiding this comment.
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 и содержат доп поля, то:
- Нужные поля из JSON должны стать полями модели, ненужные отбросить
- Для идентификаторов людей, опять же, можно использовать массивы
- Если без JSON совсем никак, то, опять же, Postgres позволяет и JSON хранить как тип
Для справки: https://guides.rubyonrails.org/active_record_postgresql.html
…mstu_2024 into feature/save-user-metrics-in-db
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
При мёрдже выберите Squash and merge плиз |
No description provided.