4

私はこのようなことをしたい:

puts Room.find(1,2,3) - Room.find(1,2)

私に与えるRoom.find(3)3つのレコードの代わりに、そのSQLレコードのみを返しますRoom.find(1,2,3)

4

4 に答える 4

6

これははるかに効率的だと思います:

first_id_list = [1, 2, 3]
second_id_list = [1, 2]
Room.find(first_id_list - second_id_list)

そうすることで、不要な行をフェッチして大量の Room オブジェクトをインスタンス化し、すぐに無視する代わりに、本当にクエリに含めたい IDのみを検索しますが、Ruby はまだガベージ コレクションを実行する必要があります。

于 2013-04-16T19:03:27.827 に答える
2

Anthony Alberto がコメントで指摘したように。これは機能します。これが機能しない唯一のケースは、部屋のインスタンスが 1 つしか見つからない場合です。たとえば、配列ではなくRoom.find(1)class のオブジェクトを返します。したがって、この Speak オブジェクトでRoom二項演算子を使用することはできません。-これを回避するには、to_aメソッドを使用します。

Array.wrap(Room.find(1,2,3)) - Array.wrap(Room.find(1))
=> Room.find(2,3)
于 2013-04-16T18:27:26.740 に答える
1

省略しても動作しputsます...

1.9.3-p327 :029 > puts Link.find(1,2,3) - Room.find(1,2)
Room Load (0.5ms)  SELECT `links`.* FROM `rooms` WHERE `rooms`.`id` IN (1, 2, 3)
Link Load (0.4ms)  SELECT `links`.* FROM `rooms` WHERE `rooms` id` IN (1, 2)
#<Room:0x95bf6a4>
 => nil 

対。

1.9.3-p327 :026 > Link.find(1,2,3) - Link.find(1,2)
  Room Load (0.8ms)  SELECT `rooms`.* FROM `rooms` WHERE `rooms`.`id` IN (1, 2, 3)
  Room Load (0.4ms)  SELECT `rooms`.* FROM `rooms` WHERE `rooms`.`id` IN (1, 2)
 => [#<Room id: 3, url_address: "http://www.linux.org", alt_text: "Linux", group_id: 3, position: 347, created_at: "2010-10-26 14:41:05", updated_at: "2010-10-26 14:41:05", version_number: "", content_date: nil>] 
1.9.3-p327 :027 > puts Room.find(1,2)
  Room Load (0.3ms)  SELECT `rooms`.* FROM `rooms` WHERE `rooms`.`id` IN (1, 2)
#<Room:0x9724094>
#<Room:0x9723ea0>
 => nil 
于 2013-04-16T18:52:34.230 に答える