こんにちは、皆さん!

今回はだいぶ具体的なプログラミングの内容ですが、Railsで記事のモデルがある際に、公開されている記事を10個だけ引き出す方法についてその周りの概念を説明しながら、紹介したいと思います。


トピック


概要

まずここでやりたいこととしては記事をたくさん取り出すということです。

この際にそれぞれの記事のステータスが公開になっていること、そして、取り出される記事の総数が10個以内(10個無い場合は)になるようにするということがポイントになってきます。

記事のモデルは下記のようなものを想定します。

title: string
published: boolean
published_at: datetime
content: text

では、ここからはそれぞれがどのようにできるのかを分解して一個ずつみていきましょう。


モデルを特定のフィールドでフィルターする方法

では、まず、公開されている記事だけが引き出されるようにフィルターをかけていきたいと思います。

Railsではwhereという関数をモデル名のあとで使うことで特定のフィールドでデータをフィルターできます。

@articles = Article.where(published: true)

where関数の中ではハッシュの形(:の左が名前、右が値)でコードが書き込まれます。この場合:の左の名前はフィールド、つまり、そのモデルが持つ何かしらのものになります。

このようにフィルターしたものは複数出て来ることが想定されます。そのため、帰ってくるものは配列です。ですので、たとえ、このフィルターの条件に合致するデータがなくても、空の配列が帰ってきますし、合致するものが一つしかない時も配列で中に一つだけの要素が入った状態で帰ってきます。

# 合致するデータなしの場合
# []
@articles = Article.where(published: true)

# 合致するデータが一つだけの場合
# [{ title: "タイトル", published: true, published_at: "Sun, 01 Jan 2012 00:00:00 +0300", content: "内容"}]
@articles = Article.where(published: true)

結果の数を制限する方法

今度は出てきたデータの一覧の数を制限する方法についてやっていきます。

なぜそもそも数を制限するのか?

ツイッターとかでもタイムラインに最初から読み込まれるツイートの数には制限があります。これは全てのツイートを読み込んでなんかしていたら、何億ものツイートを読み込むことになり、ものすごい時間がかかってしまいます。これを防ぐためにツイッターは一回ずつ20ツイートまでしか読み込みません。これと同じようなことをこれからしていきます。


Railsではデータがたくさん帰ってくるときにlimit関数を使うことで、得られるデータ数を制限することができます。

@articles = Article.limit(10)

このようにモデルのデータの一覧を取ってきた後にlimitをつけることでその数までデータの数を制限できます。

しかし、このように制限していると、一番前の10個しか取り出せない状態になってしまいます。ツイッターで一番下までいくと、次の20個のツイートが読み込まれるように、ここでも全部の中の途中から10個を引き出すことを実現していこうと思います。

この時に使用するのがoffset関数です。これを使うことで、前から何番目の場所からいくつ取ってくるというように始まりのポイントを決めることができるようになります。

# 20番目から10個取ってきます。
@articles = Article.limit(10).offset(20)

このようにして、全体をまるでページングするかのように一部分ずつ取り出すことができます。


最終的な結果

さあ、このように別々でフィルターと数制限をみてきましたが、いよいよ二つを合体させます。

とはいえ、本当にくっつけるだけですので、下記のようにして完成になります。

@articles = Article.where(published: true).limit(10).offset(10)

オフセットは必要に応じて使うか消すか対応お願いします。


まとめ

今回はRailsで公開されている記事を10個だけ引き出す方法を紹介しました。だいぶ具体的な内容ではありますが、同じような使い方がいろんなところで応用できますので、覚えておいて損はないかと思います。

Railsで学習しておくべきコンセプトについてこちらにまとめましたので、ぜひ参考にしてみてください!


皆さんの役に立つことを願います!
では、また次回まで✌
記事更新はツイッターで告知するので、ツイッターの方でもフォローお願いします!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です