- 2014年10月28日
- Rails
Rails ActiveRecordで前後のレコードを取得する
ActiveRecord モデルのインスタンスで前後のレコードを取得したかったのですけど、Rails 標準の API では見つかりませんでした。some_instance.previous, some_instance.next で、some_instance の前後レコードのインスタンスを取得できるようにしたかった。
— 環境 —
rails 4.1
activerecord 4.1
previous, next メソッドを対象モデルに実装
以下のように該当のモデルに、previous, next インスタンスメソッドを作成しました。
|
1 2 3 4 5 6 7 8 9 10 11 |
class SomeModel < ActiveRecord::Base # ... def previous SomeModel.where("id < ?", self.id).order("id DESC").first end def next SomeModel.where("id > ?", self.id).order("id ASC").first end end |
検索して調べてたら、id から ±1 して実装してある例も見つけたのですけど、それだとレコードが削除された時に id が抜けている可能性があるので汎用的でないと考えました。
なので、現在のインスタンス(self)の id より小さい/大きいかで判定。各々、直前(previou)/直後(next) のレコードを取得しています。
これで当初の目論見通り some_instance.previous, some_instance.next で、前後のレコードのインスタンスを簡単に取得できるようになり大変便利。
- - 参考リンク -
- Rails: Previous and Next record from previous query – Stack Overflow
- sql – Rails: Get next / previous record – Stack Overflow
- Rails — A faster way for next and previous links on a post, article, or any model
- - 関連記事 -
- dyld: lazy symbol binding failed: Symbol not found: _iconv_open エラー
- Capistrano デプロイでエラー
- Missing host to link to! Please provide the :host parameter
- Railsのfragment cacheでビューの一部をキャッシュ
- Railsでドットを含むURLのルーティングを実現する Segment Constraints
- Railsで同一URLで多言語化していたページを言語毎にURLを分ける
- Railsでtext_field_tagのvalue属性に初期値を設定する
- ActionMailer + Postfix(Sendmail)でメール送信
- Rails が production 環境で真っ白、SECRET_KEY_BASE 設定忘れが原因でした
- wheneverでActiveRecord管理の古いセッション情報レコードを自動で削除
- トラックバックURL
Leave Your Message!