2016-03-10 2 views
0

Я создаю Rails Api для мобильного клиента, который работает почти так же, как Tinder. Мобильные пользователи получат некоторые изображения и понравятся, не понравятся или дадут нейтральную метку изображению.Ruby On Rails - лучший способ реализовать поведение Tinder

Я хотел бы знать, как лучше всего реализовать такую ​​систему, зная, что если пользователь X получает изображение Y (тогда он дал ему подобное, неприязнь или нейтральную отметку), как убедиться, что он/она не получит тот же образ.

Я ищу мощную технику или модель, которые повысят производительность моего сервера.

FYI, в настоящее время у меня 10K пользователей и 100K изображений. поэтому очень важно сделать спокойную работу спокойной.

Я использую Ruby-on-Rails 4 и Postgresql.

+0

Как вы сохраняете значение для выбора пользователя? Не можете ли вы просто проверить наличие записи или наличие подобной/нелюбтивной/нейтральной, прежде чем показывать изображение? – toddmetheny

+0

Я подумывал добавить столбец в мою модель изображения, где он будет содержать все идентификаторы пользователей, которым понравилось, dislked или дал нейтральную метку для изображения. Этот столбец будет массивом строк (что-то возможно с postgres). –

+2

синтаксический анализ этой строки будет очень медленным. Я думаю, что таблица соединений будет лучше. Я добавлю ответ re: что я думаю. – toddmetheny

ответ

1
class ViewedImage 
    belongs_to :user 
    belongs_to :image 
end 

class User 
    has_many :viewed_images 
    has_many :images, through: :viewed_images 
end 

class Image 
    has_many :viewed_images 
    has_many :users, through: :viewed_images 
end 

Создать ViewedImage всякий раз, когда кто-то принимает действие на изображение и сохранить user_id и image_id на записи ViewedImage. Затем посмотрите, есть ли в текущем изображении запись для этого user_id/image_id.

+0

Это одно из решений, о которых я говорил. Предположим, у меня есть изображение, которое было просмотрено 1000 раз, у меня будет 1000 записей ViewedImage, связанных с этим изображением. Скажем также, что у меня около 1 миллиона записей ViewedImage, и у меня есть индекс на image_id, я думаю, было бы лучше, если бы я сохранил идентификаторы пользователей, которые просматривали изображение в массиве (это столбец, который принадлежит изображению) ... Что вы думать? –

+0

@ OmarLahlou Все еще будет намного быстрее искать эту запись с обеих этих ссылок на внешние ключи, чем это будет для синтаксического анализа строки из 1000 идентификаторов, а затем повторить ее, чтобы найти пользователя. – toddmetheny

+1

Вы могли бы сравнить оба подхода, хотя, конечно. Я чувствую себя довольно уверенно, что повторение через массив идентификаторов один за другим не может быть быстрее, но я ошибаюсь в повседневных делах, поэтому бенчмаркинг - это хороший подход. Вы также можете запустить w/строку, а затем создать записи в последнее время, если вы решите переключить подходы ... хотя инверсия также истинна. Не так сложно изменить. – toddmetheny

Смежные вопросы