On Thursday, July 12, 2012 1:42:52 AM UTC-6, Joe Van Dyk wrote:
>
> On Saturday, July 7, 2012 3:43:48 PM UTC-6, Jeremy Evans wrote:
>>
>> On Saturday, July 7, 2012 2:09:43 PM UTC-7, Joe Van Dyk wrote:
>>>
>>> Given the following:
>>>
>>> buyable = DB[:product_listings].where(:buyable => true)
>>>
>>> recent = DB[:product_listings].where("start_sale_date > now() -
>>> interval '1 day'")
>>>
>>> What's the best way to find all recent buyable products? (Ideally,
>>> without using Sequel::Model)
>>>
>>> In AR, I'd do:
>>>
>>> class ProductListing
>>> scope :buyable, where(:buyable => true)
>>> scope :recent, where("start_sale_date > now() - interval '1 day'")
>>> end
>>> ProductListing.buyable.recent
>>>
>>
>> You probably want to use subset:
>>
>> class ProductListing
>> subset :buyable, :buyable => true
>> subset :recent, "start_sale_date > now() - interval '1 day'"
>> end
>>
>> or for more general things that aren't simple where conditions, either
>> def_dataset_method:
>>
>> class ProductListing
>> def_dataset_method(:buyable){where(:buyable => true)}
>> def_dataset_method(:recent){where("start_sale_date > now() - interval
>> '1 day'")}
>> end
>>
>> or dataset_module:
>>
>> class ProductListing
>> dataset_module do
>> def buyable; where(:buyable => true) end
>> def recent; where("start_sale_date > now() - interval '1 day'") end
>> end
>> end
>>
>> All of those are for Sequel::Model though.
>>
>>
> I was hoping to not use Sequel::Model. :)
>
>
>> If you really want to get the intersection of products that are both
>> buyable and recent taking the two separate datasets as input, you want an
>> SQL INTERSECT query:
>>
>> DB[:product_listings].where(:buyable =>
>> true).intersect(DB[:product_listings].where("start_sale_date > now() -
>> interval '1 day'"))
>>
>>
> I don't think that sort of intersection would be nearly as efficient as
> combining the where clauses.
>
>
>> However, it's rare to actually do that. In most cases you'd just add the
>> appropriate buyable and recent filter conditions to the same dataset, where
>> they would be ANDed together in the where clause:
>>
>> DB[:product_listings].where(:buyable => true).where("start_sale_date >
>> now() - interval '1 day'")
>>
>
> Right, so what I was looking for is a way to combine these where clauses.
>
> Maybe I want to do something sorta like:
>
> def Decorate ds
>
> def ds.with_recent
>
> where("start_sale_date < now() - interval '1 month'")
>
> end
>
>
>
> def ds.with_buyable
>
> where(:buyable => true)
>
> end
>
> ds
>
> end
>
>
>
> puts Decorate(DB[:product_listings]).with_buyable.with_recent.sql
>
> Thoughts?
>
Or, I could put the methods into a Module and extend the dataset object:
module TheModule
def with_buyable ...
end
end
DB[:products].extend(TheModule).with_buyable.with_recent
Does anyone do anything similar?
--
You received this message because you are subscribed to the Google Groups
"sequel-talk" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/sequel-talk/-/4pIdza8NAcQJ.
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.