1

私の連絡先の配列(モデル)に、ある値と等しいIDを持つ連絡先が含まれている場合、trueを返したいだけです。例えば:

@contacts = Contact.all

@someval = "alskjdf"

find_val(@contacts, @someval)

def find_val(contacts, val)
  @contact.each do |c|
    if c.id == val
      return true
    end
  end
  return false
end

連絡先のリストを持つ外部 API から一部のデータを除外するために、アプリでこれを繰り返し (この特定のアクションで最大約 100 回) 行う必要があります。これは高額になるのでしょうか?

db から引き下げられた後、配列上で ActiveRecord を検索するのと同様に、より高速に何かを実行できるのではないかと考えましたが、それを理解することはできません。このように ActiveRecord を呼び出すのはコストがかかりすぎますか?

Contacts.find_by_id(@someval)

上記の行は何百回も呼び出す必要があります...配列を反復処理する方が安価になると思います。ありがとう!

4

2 に答える 2

2

最良の方法は、データベースからすべての連絡先を取得した後、連絡先 ID をキーとして使用して、ハッシュで連絡先にインデックスを付けることです。

contacts = Contact.all.inject({}) {|hash, contact| hash[contact.id] = contact; hash }

contact[id]その後、パフォーマンスの高い方法で簡単に連絡を取ることができます.

于 2012-06-29T00:01:05.740 に答える
1

配列を検索するために記述しなければならないコードの量を減らす 1 つの方法は、配列クラスを開いてカスタム インスタンス メソッドを作成することです。

class Array
  def haz_value?(someval)
    if self.first.respond_to? :id
      self.select { |contact| contact.id == someval }.length > 0
    else
      false
    end
  end
end

その後、 を呼び出すことができます@contacts.haz_value? @someval。効率に関しては比較はしていませんが、どちらの方法も Array の組み込みイテレータを使用しています。データベースにストアド プロシージャを作成し、ActiveRecord を介して呼び出す方がおそらく高速でしょう。その方法は次のとおりです

于 2012-06-29T00:01:21.840 に答える