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 -~----------~----~----~----~------~----~------~--~---
