Redis, Mongoid, Rails - Используйте атрибуты redis в представлении - PullRequest
1 голос
/ 05 ноября 2011
def add_like user_id
  $redis.sadd "likes:#{_id}", user_id
end

def remove_like user_id
  $redis.srem "likes:#{_id}", user_id
end

def likes
  return $redis.scard("likes:#{_id}")
end

Очень простой код для добавления лайков. Дело в том, что я хочу легко их найти в контроллере. например когда я делаю @event = Event.find(params[:id], я хочу получить доступ к лайкам в представлении как @event.likes.

Предложения

Что еще более важно, я хочу проверить, понравилось ли это текущему пользователю. куда мне поместить этот код? в контроллере? перебрать все события с liked_this?, это пахнет.

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Редактировать: Вот что происходит, когда я набираю код из памяти.Для ActiveRecord self.id возвращает первичный ключ текущей записи, который является целым числом, если вы намеренно не установите его в другое значение.Для Mongoid self.id возвращает вместо BSON::ObjectId.Вам нужен строковый ключ для Redis, поэтому вы должны вызвать to_s для объекта BSON следующим образом: self.id.to_s.

Добавление способности к @event.likes в ваших представлениях тривиально.Добавьте метод likes в вашу модель следующим образом:

def Event
  def likes
    $redis.scard("likes:#{self.id.to_s}") # return is not necessary
  end
end

Если вы хотите использовать mongoid, чтобы проверить, понравилось ли текущему пользователю событие, не повторяя его по каждому событию, вам нужно будет сохранить лайки.в mongodb, а не в redis.

0 голосов
/ 05 ноября 2011

В модели:

after_initialize :likes

и

def likes
  return self['likes'] = $redis.scard("likes:#{_id}")
end

Я не совсем уверен, почему эта страница в документах помогла мне , и ямне не нравится тот факт, что я программирую это по совпадению / интуиции.

...