Данные истории активности пользователей Rails 3 - PullRequest
0 голосов
/ 24 января 2012

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

У меня есть приложение rails 3.1.3 с пользователями, которые могут просматривать медиа-файлы. Я хочу сохранить историю их деятельности в отношении просмотра их СМИ. Цель состоит в том, чтобы иметь возможность записывать историю таким образом, чтобы я мог отслеживать ее от пользователя или от носителя, например, получить данные для user.history () и media.history (), чтобы показать как все медиа, к которым обращается пользователь, так и все пользователи, которые обращались к определенному фрагменту медиа, вместе с другими данными, касающимися каждой транзакции.

До сих пор единственный способ, которым я смог придумать, который удовлетворительно удовлетворяет это, - это создать отдельный объект истории для каждой транзакции, примерно так:

class history_item
   belongs_to: media_object
   belongs_to: user
   (other transaction-specific data)
end

Что меня беспокоит по этому поводу, так это число записей в базе данных, которые быстро увеличатся при обычном использовании этого приложения. Есть ли лучший способ решения этой проблемы, о котором я не думал? Я новичок в рельсах и разработке больших веб-приложений в целом, и я не совсем уверен, как обычно это делается.

1 Ответ

0 голосов
/ 24 января 2012

Я бы создал такую ​​модель как класс Viewing в качестве модели HABTM между User и MediaObject.Это делает фактическую структуру более очевидной, чем просто наличие отношения под названием history.Конечно, вы также можете добавить методы для User#history и MediaObject#history, если вам нужен именно тот интерфейс, который вы описали.

class User
  has_many :viewings
  has_many :viewed_media_objects, :through => :viewings
end

class MediaObject
  has_many :viewings
  has_many :viewers, :through => :viewings
end

class Viewing
  belongs_to :user
  belongs_to :media_object
end

При запросе этих объектов, например, задано user = User.first, есливы знаете, что хотите перебрать viewed_media_objects пользователя в действии, вы можете использовать @user = User.include(:viewed_media_objects).find(params[:id]), чтобы убедиться, что rails извлекает связанные просмотры и медиа-объекты одновременно с пользователем.Таким образом, вы не получите целую кучу вызовов базы данных.

...