2

を持つseatオブジェクトを持つcarオブジェクトがownerありますnamecar brandcar's owner'を一緒に表示したいname。1つのクエリでこれを行うにはどうすればよいですか?

例えば:

class Seat < ActiveRecord::Base
  belongs_to :car

  def description
    "I am in a #{car.brand} belonging to #{car.owner.name}"
    # --> how do I replace this with one query?
  end
end

これは私の質問を単純化するための非常に工夫された例であることに注意してください。私はこれを何千回も続けて行っているので、より効率的なものが必要です。

4

3 に答える 3

3

モデルをクエリしようとしてSeatいて、車と所有者のオブジェクトを熱心にロードしたい場合は、このincludes句を使用できます。

Seat.includes(:car => :owner).where(:color => :red).each do |seat|
  "I am in a #{seat.car.brand} belonging to #{seat.car.owner.name}"
end
于 2012-06-22T02:57:05.040 に答える
0

使用するdefault_scope

class Seat
  default_scope includes([:car])
 end

class Car
  default_scope includes([:owner, :seats])
end
于 2012-06-22T02:36:21.770 に答える
0

私のアプリケーションでよく使用されるマルチテーブル結合の場合、MySQLでビューを作成します。次に、ビューに基づいてActiveRecordRailsモデルを作成します。

ビューを強化するSQLステートメントによっては、MySQLがビューの読み取り/書き込みを許可する場合もあります。しかし、私は単純なルートをたどり、常にビューを読み取り専用として扱います。ARモデルを読み取り専用として設定できます。

ビューを使用するActiveRecordモデルを使用することにより、データベースの単一クエリ読み取りをすばやく取得できます。また、MySQLがビューのSQL「プラン」を1回計算するため、通常よりもさらに高速になり、ビューをより高速に使用できるようになります。

また、外部キーがすべてインデックスに登録されていることを確認することを忘れないでください。テーブルスキャンは必要ありません。

于 2012-06-22T02:46:15.140 に答える