指定した件数だけレコードが欲しい!
「あー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が配列を返すことにも注意しましょう。