私はこのようなことをしたい:
puts Room.find(1,2,3) - Room.find(1,2)
私に与えるRoom.find(3)
3つのレコードの代わりに、そのSQLレコードのみを返しますRoom.find(1,2,3)
私はこのようなことをしたい:
puts Room.find(1,2,3) - Room.find(1,2)
私に与えるRoom.find(3)
3つのレコードの代わりに、そのSQLレコードのみを返しますRoom.find(1,2,3)
これははるかに効率的だと思います:
first_id_list = [1, 2, 3]
second_id_list = [1, 2]
Room.find(first_id_list - second_id_list)
そうすることで、不要な行をフェッチして大量の Room オブジェクトをインスタンス化し、すぐに無視する代わりに、本当にクエリに含めたい IDのみを検索しますが、Ruby はまだガベージ コレクションを実行する必要があります。
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)
省略しても動作し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