2

スラッグを介してモデルの1つのインスタンスを検索しようとしていますが、これは次の方法で実行できます

@project = Project.where(:slug => params[:id]).first

しかし、インスタンスを取得したら、日付である publish という列の順序からモデルの次および前のインスタンスを見つけたいと思います。

列による任意の順序の前と次のインスタンスのみのスラッグを取得するにはどうすればよいですか?

::編集::これをモデルに追加するとうまくいきました。

def previous(offset = 0)     
  self.class.select('slug').first(:conditions => ['published < ?', self.id], :limit => 1,        :offset => offset, :order => "published DESC")
end

def next(offset = 0)
  self.class.select('slug').first(:conditions => ['published > ?', self.id], :limit => 1, :offset => offset, :order => "published ASC")
end

このソリューションは、名前付きスコープを使用した次の前のレコードで見つけました

4

1 に答える 1

8

publish日付が一意であると仮定すると、次のようなものが機能するはずです。

@project = Project.where(:slug => params[:id]).first

@prev_project = Project.where( "publish < ?", @project.publish ).
                        order( "publish DESC" ).
                        first

@next_project = Project.where( "publish > ?", @project.publish ).
                        order( "publish" ).
                        first

この節は の前のすべてのプロジェクトを示し@prev_project、は最新のものを最初にリストし (直前のプロジェクトを一番上に置きます) 、クエリを 1 つの結果、つまり前のプロジェクトに制限します。のクエリは同じですが、逆になっています。一意でない場合は、2 番目の基準でもソートする必要があります。where@projectorder@projectfirst@next_projectpublish

ただし、車輪を再発明するのではなく、非常に一般的なgemacts_as_listを使用することを検討することをお勧め@project.higher_itemします@project.lower_item

于 2012-05-23T03:58:42.710 に答える