peritor / simply_stored

A convenience wrapper around CouchDB (using CouchPotato) that supports relations and S3 attachments
Other
140 stars 16 forks source link

SimpleObject.last not implemented #8

Open d5e opened 13 years ago

d5e commented 13 years ago

I have found that in simply_stored/lib/simply_stored/couch/finders.rb there is a :first method implemented, so I can fetch the first record of that type. Working.

But I am missing a :last method allowing me, to get the last record ...

should be something like

def last(*args)
  find(:last, *args)
end

as the first query is made via

CouchPotato.database.view(all_documents(:limit => 1)).first

it seems that a performant approach has to look different for last as for first as we cannot use that :limit => 1 here

roidrage commented 13 years ago

Yrah, it would have to look different, but that's not hard to achieve with CouchDB, as you can tell it to walk the view's b-tree backwards. I'll look into it.

d5e commented 13 years ago

hey matt, I just found out one way of achieving this MyModel.last thing ... I am not sure whether there is a more generic method, but If you specify a view for the model like

view :latest_view, :key => :created_at, :descending => true, :limit => 1

def self.last
    CouchPotato.database.view(Document.latest_view).first
end

this would return the last Document

d5e commented 13 years ago

I just found out one more option ... without the need to define a view inside the model

#simply_stored/couch/finders.rb
        when :last
          if with_deleted || !soft_deleting_enabled?
            CouchPotato.database.view(all_documents(:limit => 1, :descending => true)).first
          else
            CouchPotato.database.view(all_documents_without_deleted(
              :key => nil, :limit => 1, :descending => true)).first
          end
        else

best regards!

Henry