В моем приложении у меня есть модель search_volume.rb , которая выглядит следующим образом:
search_volume.rb :
class SearchVolume < ApplicationRecord
# t.integer "keyword_id"
# t.integer "search_engine_id"
# t.date "date"
# t.integer "volume"
belongs_to :keyword
belongs_to :search_engine
end
keyword.rb :
class Keyword < ApplicationRecord
has_and_belongs_to_many :labels
has_many :search_volumes
end
search_engine.rb :
class SearchEngine < ApplicationRecord
belongs_to :country
belongs_to :language
end
label.rb :
class Label < ApplicationRecord
has_and_belongs_to_many :keywords
has_many :search_volumes, through: :keywords
end
На странице ярлыка # index я пытаюсь показать сумму search_volumes для ключевых слов в каждом ярлыке за последний месяц для search_engine, который пользователь приготовил. Я могу сделать это с помощью следующего:
<% @labels.each do |label| %>
<%= number_with_delimiter(label.search_volumes.where(search_engine_id: cookies[:search_engine_id]).where(date: 1.month.ago.beginning_of_month..1.month.ago.end_of_month).sum(:volume)) %>
<% end %>
Это работает хорошо, но у меня есть ощущение, что вышеупомянутое очень неэффективно. При нынешнем подходе я также затрудняюсь выполнять операции с объемами поиска. Большую часть времени я просто хочу узнать об объеме поиска в прошлом месяце.
Обычно я бы создавал counter_cache для модели ключевых слов, чтобы отслеживать последние параметры search_volume, но, поскольку существуют десятки search_engines, мне пришлось бы создавать по одному для каждого, что также неэффективно.
Какой самый эффективный способ хранить объем поиска за последний месяц для всех различных поисковых систем отдельно?