0

私は最初の大きなRailsアプリに取り組んでいますが、何かについて少し混乱しています。

データベースレベルでより多くの作業を行うと、パフォーマンスが向上することを私は知っています。しかし、データベースレベルで実行されているコマンドの種類については混乱しています。

例えば:

@tasks = @project.tasks
<%= render partial: 'task', collection: @tasks %>

それはデータベースレベルで機能していますか?

ありがとう、私はこれが非常に初心者の質問であることを知っています!

4

3 に答える 3

1

「データベースレベルでより多くの作業を行うと、パフォーマンスが向上します」

はい、そうなります。非常に基本的なレールのもの、つまり

@thing = Thing.find(id)

非常に効率的で、通常、これらの場合のパフォーマンスは気にしません。

しかし、ある種のフィルターはどうですか。

特定の文字セットを含む名前を検索する機能を実装したいとします (これは説明のための不自然な例です)。

あなたはこれを行うことができます:

@things = Thing.all
@foothings = []
@things.each do |thing|
  if /foo/ =~ thing.name
    @foothings << thing 
  end
end

または、次のようにすることもできます。

class Thing < ActiveRecord::Base
   def self.filtered(what)
     self.where("name like ?","%#{what}%")
   end
end


@foothings = Thing.filtered("foo")

データベースは、はるかに高速に検索を実行します (2 番目の例)。これは高度に調整および最適化された C コード (おそらく) であり、RoR は依然としてインタープリター言語です。また、最初の例では、データベースからすべてのものが要求されます。2 番目の例では、名前に「foo」を含むもののみが返されます。RoR マシンとデータベース マシンの間にネットワーク遅延がある場合は、パフォーマンスにも影響する可能性があります。

于 2013-02-20T18:09:09.977 に答える
1

が Task クラスとの関係を持つ ActiveRecord オブジェクトであると仮定する@projectと、データベースに対してフェッチが行われ、@tasksオブジェクトが読み込まれます。

rails server を実行すると、コンソールの出力が表示されます。データベースに対して SQL クエリを実行すると表示されます。これは、コードが実行されるプロセスを理解するのに役立ちます。Railsを楽しんでください!

于 2013-02-20T17:53:11.870 に答える
0

使用するデータベースを実際に作成しない限り、データベース レベルは実際にはコードの一部ではありません。優れたプログラム設計は、データベースとのインターフェイスです。たとえば、mysql にクエリを実行すると、mysql がデータベースにクエリを実行し、コードで使用する結果を返します。したがって、データベース レベルは mysql 自体が結果を照会することであり、これは既に高度に最適化されているため、ほとんどの作業を行う場所です。パフォーマンスが発揮されるのは、ほとんどの作業をダンプすることです。たとえば、「SELECT * from mytable」のようなクエリを作成すると、大量の要素が取得されます。それが必要な場合は素晴らしいですが、このセットから特定のアイテムが必要な場合は、セット全体で何らかの検索アルゴリズムを使用する必要があります (潜在的にすべてをスキャンする必要があります。

于 2013-02-20T18:24:59.400 に答える