On Thu, Nov 15, 2012 at 10:19 PM, Colin Law <[email protected]> wrote:

> On 15 November 2012 09:11, Jim Ruther Nill <[email protected]> wrote:
> >
> >
> >
> > On Thu, Nov 15, 2012 at 4:51 PM, Colin Law <[email protected]>
> wrote:
> >>
> >> On 15 November 2012 08:09, Mauro <[email protected]> wrote:
> >> > On 14 November 2012 22:21, Colin Law <[email protected]> wrote:
> >> >> On 14 November 2012 21:07, Mauro <[email protected]> wrote:
> >> >>> I have a model Reservation with reserved_from and reserve_to
> >> >>> attributes of type date.
> >> >>> I want create a scope of all reservations where Date.today is
> between
> >> >>> reserved_from and reserved_to.
> >> >>> In the model I've done:
> >> >>>
> >> >>> def self.today_reservation
> >> >>>     find_each do |res|
> >> >>>         if (Date.today).between?(res.reserved_from, res.reserved_to)
> >> >>>                 return
> >> >>>         else
> >> >>>                 puts "false"
> >> >>>         end
> >> >>>     end
> >> >>>   end
> >> >>>   scope :today_reservations, today_reservation
> >> >>>
> >> >>> but it doesn't work.
> >> >>> If reserved_from is 2012-11-01 and reserved_to is 2012-11-02 and
> >> >>> Date.today is 2012-11-14 the method above method return an
> >> >>> activerecord relation.
> >> >>
> >> >> That is not how scopes work.  You need something like (not tested)
> >> >> scope :today_reservations, lambda {   where("reserved_from > ? and
> >> >> reserved_to <= ?", Date.today,  Date.today ) }
> >> >
> >> > Without lamda it's the same thing?
> >> > scope :today_reservations, where("reserved_from > ? and
> >> >> reserved_to <= ?", Date.today,  Date.today ) works the same.
> >>
> >> No it doesn't.  Well it does today but if you don't restart the server
> >> then it won't work tomorrow.  Without the lambda it is determining
> >> Date.today only once when it loads that line of code.  You need the
> >> lambda so that it recalculates it every time you run the scope.
> >
> >
> > Colin is right but you can also use class methods so you dont have to
> worry
> > about
> > adding lambdas
> >
> > def self.today_reservations
> >   where('reserved_from > :date AND reserved_to <= :date', date:
> Date.today)
> > end
>
> Does that have any advantage over using a scope?  It has the
> disadvantage that one could not say things like
> Reservation.where(some conditions).today_reservations
>

i don't know if it has any advantage but you can definitely do that.  You
can
chain class methods as long as the method returns an active record relation

def self.foo
  # build conditions here
  where(conds)
end

def self.order_method
  order(order_here)
end

then you can use these methods like scopes

Reservation.foo.order_method.where(foo)

In fact I think my previous comment only applies to production mode
> since the code would be reloaded for each request in development mode
> and so all would appear to work well - until deployment that is.  I am
> not even sure how to write a test that would fail for the code without
> the lambda.
>

> Colin
>
> --
> You received this message because you are subscribed to the Google Groups
> "Ruby on Rails: Talk" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>


-- 
-------------------------------------------------------------
visit my blog at http://jimlabs.heroku.com

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to