Very detailed explanation and working solution.
you rock Jeremy !

Thanks :)

On 9 oct, 22:22, Jeremy Evans <[email protected]> wrote:
> On Oct 9, 10:01 am, Florent <[email protected]> wrote:
>
>
>
> > Sorry for this noob question but I can't get it work after few hours
> > on it, it's getting me crazy...
>
> > the long story is:
> > I have a model with subset methods that use a dynamic argument based
> > on Time.now
>
> > subset(:recent) { |p| (!p.published) | (p.published < Time.now - 3600
> > * 24)  }
>
> > First thing I spotted: I need to use this syntax in order that
> > Time.now is called each time I call MyModel.
> > this line:
>
> > subset(:tt, :published < Time.now - 3600 * 24)
>
> > doesn't work, Time.now is called once when loading my model and keep
> > this value each call to the subset.
>
> You should be able to use the following syntax now:
>
>   subset(:tt, :published < Sequel::CURRENT_TIMESTAMP - 3600 * 24)
>
> Whether that will work depends on the how the database handles
> subtracting a numeric value from a timestamp.
>
> > But what I totally don't understand, it's how OR / AND and NULL values
> > is used
> > I tried:
>
> > >> News.filter { (!published ) | (published  < Time.now - 3600 * 24}
>
> > => #<Sequel::Postgres::Dataset: "SELECT * FROM \"news\" WHERE true">
>
> published is going to return a Sequel::SQL::Identifier.
>
> !published is going to return false.
>
> (published  < Time.now - 3600 * 24) is going to return a
> Sequel::SQL::BooleanExpression.
>
> false | Sequel::SQL::BooleanExpression is going to return true, which
> is why you get those results.
>
> > >> News.filter { (~published ) | (published  < Time.now - 3600 * 24}
>
> > => #<Sequel::Postgres::Dataset: "SELECT * FROM \"news\" WHERE (NOT
> > \"published \" OR (\"published \" < '2009-10-09
> > 18:56:29.704914+0200'))">
>
> This isn't what you want, because published isn't boolean, it's a
> timestamp.
>
> > >> News.filter { (published   = nil) | (published  < Time.now - 3600 * 24}
>
> > NoMethodError: undefined method `<' for nil:NilClass
>
> Here you are setting a local variable published to nil, and then
> referencing it later.  NilClass#< is not defined, which is why you get
> the no message error.
>
> > >> News.filter { |o| (o.published  = nil.sql_expr) | (o.published  < 
> > >> Time.now - 3600 * 24) }
>
> > NoMethodError: undefined method `sql_expr' for nil:NilClass
>
> NilClass#sql_expr is not defined.  Even if you include the sql_expr
> extension, o.published = nil.sql_expr is just going to return
> nil.sql_expr, so you'd end up with:
>
>    SELECT * FROM `news` WHERE (NULL OR (`published` < '2009-10-08
> 13:17:39.387322-0700'))
>
> You need to use a hash if you want IS NULL.
>
> > I just want to filter all NULL values OR rows for 1 day.
> > I tried to combine filter with exclude but I don't want a NOT I would
> > like a IS NULL
>
>   News.filter{{published => nil} | (published < Time.now - 3600 * 24}
>
> Jeremy
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sequel-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 this group at 
http://groups.google.com/group/sequel-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to