Я только что реализовал загружаемый контент для клиента.
Я написал метод экземпляра для класса пользователя, который извлекает приобретенные пользователем товары, например ::100100
class User < ActiveRecord::Base
...
def downloads
self.orders.collect { |o| o.products }.flatten
end
end
Вы могли бы использовать включить? способ проверить, купил ли пользователь товар, например ::10000
def item_link(item)
if current_user && current_user.downloads.include?(item)
download_link(item, 'book-price')
else
link_to item.price, item
end
end
К сожалению, хотя это и немного более явно, оно будет повторять заказы пользователя при каждом обращении к item_link. Я бы предложил оптимизировать это с помощью низкоуровневого кэширования в Rails, где вы можете очищать кеш каждый раз, когда пользователь входит в систему или совершает покупку.
Низкоуровневый кеш Rails может выглядеть так:
def downoads
Rails.cache.fetch("user-downloads-#{self.id}") do
self.orders.collect { |o| o.products }.flatten
end
end
И вызовите следующее, чтобы очистить кеш:
Rails.cache.delete("user-downloads-#{self.id}")