【Ruby】指定した数のレコードを取り出したい

指定した件数だけレコードが欲しい!

「あーActiveRecordからレコード取り出したいけど、数制限したいよなー」

誰しもが思うことだと思います。

そこで、今回は下記の二つのメソッドを紹介します。

takeメソッドを使う

takeメソッドは、take(n)のように数を指定して、レコードをDBから読み込んで取り出すことができます。

以下で例を紹介します。

lotte_members = Member.where(team: "lotte")

lotte_members.take(3)
=> [#<Member:0x000000010ebebc70 id: 8, name: "ogino", team: "lotte">,
 #<Member:0x000000010ebebb30 id: 9, name: "fujiwara", team: "lotte">,
 #<Member:0x000000010ebeba68 id: 11, name: team: "lotte">]

返り値は以下のように、Arrayを返します。

lotte_members.take(3).class
=> Array

limitメソッドを使う

limitもtakeと同じように、limit(n)で数を指定してレコードを取り出すメソッドです。

例は以下のような感じです。

lotte_members = Member.where(team: "lotte")

lotte_members.limit(3)
  Member Load (2.1ms)  SELECT `members`.* FROM `members` WHERE `members`.`team` = 'lotte' LIMIT 3
=> [#<Member:0x000000010eb89840 id: 8, name: "ogino", team: "lotte">,
 #<Member:0x000000010eb894f8 id: 9, name: "fujiwara", team: "lotte">,
 #<Member:0x000000010eb89278 id: 11, name: "yasuda", team: "lotte">]

takeとの違いは、返り値にあります。

lotte_members.limit(3).class
=> Member::ActiveRecord_Relation

limitの場合、上記のようにMember::ActiveRecord_Relationを返します。

takeを使った後では、ActiveRecord_Relationのメソッド(find_by等)を使うことができません

なので、ActiveRecord_Relationのメソッドを使う必要がある場合は、limitを使う方がいいかもしれません。

また、どちらを使うかと考える際は、takeが配列を返すことにも注意しましょう。

タイトルとURLをコピーしました