什么是从不同的散列比较两个值最快的方法?

问题描述 投票:0回答:1

我想比较两个哈希值,看看是否值匹配,所以我可以调和的一些数据。

我有现有帐户的哈希值,我需要(如果存在)基于现有的帐户,看它是否需要插入检查账户的哈希值。

# 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函数,可以做到这一点,但我还没有找到一个。

什么是这样做的最有效的方法是什么?

ruby-on-rails ruby
1个回答
0
投票

什么你要找的是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

注意BEGINCOMMIT语句。他们表示在呼叫开始和结束。

 (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

注总数BEGINCOMMIT消息:

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
© www.soinside.com 2019 - 2024. All rights reserved.