Какой самый быстрый способ сравнить два значения из разных хешей? - PullRequest
0 голосов
/ 06 февраля 2019

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

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

# Reconcile Adaccounts
def self.reconcileAdaccounts(ad_accounts, user_id)

    # These are the accounts that exist
    existing_accounts = FbAdaccount.active
                                    .select("fb_id")
                                    .where("user_id = ?", user_id)
                                    .as_json

    ad_accounts.each do |ad_account|

        if #here i would need to check if ad_account["account_id"] matches one of the existing records

            p "This one already exists"
            p ad_account["account_id"]
        else

            p "I need to create this one"
            p ad_account["account_id"]
        end

    end

end

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

Каков наиболее эффективный способ сделать это?

1 Ответ

0 голосов
/ 06 февраля 2019

То, что вы ищете, это find_or_create_by.Я дополнительно обернул вызов в транзакцию, чтобы все это попадало в базу данных только один раз - в одном запросе.

def self.reconcileAdaccounts(ad_accounts, user_id)
  FbAdaccount.transaction do
    ad_accounts.each do |ad_account|
      FbAdaccount.active
                 .select('fb_id')
                 .where('user_id = ?', user_id)
                 .find_or_create_by(ad_account['account_id'])
    end
  end
end

Транзакции

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

С помощью следующего кода:

numbers = (3..7).to_a

Ear.transaction do
  numbers.each do |number|
    Ear.find_or_create_by(bla: number)
  end
end

Обратите внимание на BEGIN и COMMIT заявления.Они указывают, где начинается и заканчивается вызов.

 (0.1ms)  BEGIN
Ear Load (0.5ms)  SELECT  "ears".* FROM "ears" WHERE "ears"."bla" = $1 LIMIT $2  [["bla", 3], ["LIMIT", 1]]
Ear Create (0.8ms)  INSERT INTO "ears" ("bla", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["bla", 3], ["created_at", "2019-02-05 23:17:28.157989"], ["updated_at", "2019-02-05 23:17:28.157989"]]
Ear Load (0.2ms)  SELECT  "ears".* FROM "ears" WHERE "ears"."bla" = $1 LIMIT $2  [["bla", 4], ["LIMIT", 1]]
Ear Create (0.2ms)  INSERT INTO "ears" ("bla", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["bla", 4], ["created_at", "2019-02-05 23:17:28.160838"], ["updated_at", "2019-02-05 23:17:28.160838"]]
Ear Load (0.1ms)  SELECT  "ears".* FROM "ears" WHERE "ears"."bla" = $1 LIMIT $2  [["bla", 5], ["LIMIT", 1]]
Ear Create (0.2ms)  INSERT INTO "ears" ("bla", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["bla", 5], ["created_at", "2019-02-05 23:17:28.162241"], ["updated_at", "2019-02-05 23:17:28.162241"]]
Ear Load (0.2ms)  SELECT  "ears".* FROM "ears" WHERE "ears"."bla" = $1 LIMIT $2  [["bla", 6], ["LIMIT", 1]]
Ear Create (0.2ms)  INSERT INTO "ears" ("bla", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["bla", 6], ["created_at", "2019-02-05 23:17:28.163794"], ["updated_at", "2019-02-05 23:17:28.163794"]]
Ear Load (0.2ms)  SELECT  "ears".* FROM "ears" WHERE "ears"."bla" = $1 LIMIT $2  [["bla", 7], ["LIMIT", 1]]
Ear Create (0.2ms)  INSERT INTO "ears" ("bla", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["bla", 7], ["created_at", "2019-02-05 23:17:28.165589"], ["updated_at", "2019-02-05 23:17:28.165589"]]
 (40.9ms)  COMMIT

Теперь вот тот же код, только без транзакции, чтобы обернуть его:

numbers = (20..25).to_a

numbers.each do |number|
  Ear.find_or_create_by(bla: number)
end

Обратите внимание на общее число BEGIN иCOMMIT сообщения:

Ear Load (249.3ms)  SELECT  "ears".* FROM "ears" WHERE "ears"."bla" = $1 LIMIT $2  [["bla", 20], ["LIMIT", 1]]
(73.4ms)  BEGIN
Ear Create (48.7ms)  INSERT INTO "ears" ("bla", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["bla", 20], ["created_at", "2019-02-06 00:12:35.754374"], ["updated_at", "2019-02-06 00:12:35.754374"]]
(79.8ms)  COMMIT
Ear Load (0.4ms)  SELECT  "ears".* FROM "ears" WHERE "ears"."bla" = $1 LIMIT $2  [["bla", 21], ["LIMIT", 1]]
(0.2ms)  BEGIN
Ear Create (77.7ms)  INSERT INTO "ears" ("bla", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["bla", 21], ["created_at", "2019-02-06 00:12:35.918461"], ["updated_at", "2019-02-06 00:12:35.918461"]]
(0.3ms)  COMMIT
Ear Load (0.2ms)  SELECT  "ears".* FROM "ears" WHERE "ears"."bla" = $1 LIMIT $2  [["bla", 22], ["LIMIT", 1]]
(0.2ms)  BEGIN
Ear Create (2.7ms)  INSERT INTO "ears" ("bla", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["bla", 22], ["created_at", "2019-02-06 00:12:36.003822"], ["updated_at", "2019-02-06 00:12:36.003822"]]
(110.1ms)  COMMIT
Ear Load (0.3ms)  SELECT  "ears".* FROM "ears" WHERE "ears"."bla" = $1 LIMIT $2  [["bla", 23], ["LIMIT", 1]]
(0.2ms)  BEGIN
Ear Create (0.3ms)  INSERT INTO "ears" ("bla", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["bla", 23], ["created_at", "2019-02-06 00:12:36.125187"], ["updated_at", "2019-02-06 00:12:36.125187"]]
(37.0ms)  COMMIT
Ear Load (0.2ms)  SELECT  "ears".* FROM "ears" WHERE "ears"."bla" = $1 LIMIT $2  [["bla", 24], ["LIMIT", 1]]
(0.2ms)  BEGIN
Ear Create (0.4ms)  INSERT INTO "ears" ("bla", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["bla", 24], ["created_at", "2019-02-06 00:12:36.168414"], ["updated_at", "2019-02-06 00:12:36.168414"]]
(72.4ms)  COMMIT
Ear Load (0.3ms)  SELECT  "ears".* FROM "ears" WHERE "ears"."bla" = $1 LIMIT $2  [["bla", 25], ["LIMIT", 1]]
(1.7ms)  BEGIN
Ear Create (0.4ms)  INSERT INTO "ears" ("bla", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["bla", 25], ["created_at", "2019-02-06 00:12:36.249285"], ["updated_at", "2019-02-06 00:12:36.249285"]]
(121.2ms)  COMMIT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...