Rails - самый эффективный способ извлечения данных из простой модели - PullRequest
0 голосов
/ 01 октября 2019

У меня есть две простые модели - Campaign и CampaignCode, из которых мне придется вытащить количество уже использованных CampaignCode. Поскольку это большой объем данных (200 тыс. Кодов только для одной кампании), мне интересно, какой способ будет наиболее эффективным для этого?

query

CampaignCode.where(state: 'used').count

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

campaign модель

#  created_at         :datetime         not null
#  end_date           :date
#  id                 :bigint(8)        not null, primary key
#  name               :text             not null
#  start_date         :date
#  updated_at         :datetime         not null

class Campaign < ApplicationRecord
  has_many :campaign_codes

  validates :name, presence: true
end

campaign_code модель

#created_at         :datetime         not null
#campaign_id        :bigint(8)
#state              :integer
#uid                :string           not null, primary key
#updated_at         :datetime         not null

class CampaignCode < ApplicationRecord
  self.primary_key = :uid

  belongs_to :campaign

  validates :uid, uniqueness: true
end

1 Ответ

0 голосов
/ 01 октября 2019

Если вам нужна скорость, вы должны использовать прямой SQL и использовать хитрости вашей базы данных.

Я бы сделал пользовательский запрос в вашей модели (если PostgreSQL):

def self.count_used_codes
  sql = <<-SQL
    SELECT count(*) FROM campaign_codes WHERE state == 'used';
  SQL
  self.find_by_sql(sql)
end

Тогдаиспользуйте с

CampaignCode.count_used_codes

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

Я также видел, как люди делают конкретныеПапка sql в приложении, а затем ссылки на сложные запросы, чтобы сохранить все это в чистоте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...