Using tsrange looks really promising, thanks for the suggestion! One 
question on sequel syntax: what's the correct form to set +infinity as the 
end time?

On Monday, June 15, 2015 at 4:00:34 PM UTC-4, Jeremy Evans wrote:
>
> On Monday, June 15, 2015 at 12:40:01 PM UTC-7, Andrew Burleson wrote:
>>
>> Yes this is more of a SQL question (sorry, unfortunately my ruby fu 
>> greatly exceeds my SQL fu).
>>
>> And yes, "Basically, you are looking for orders where the last entry 
>> before the given time in the order_states table had a state of active," and 
>> I don't really know how to set that up in SQL.
>>
>> Digging more on your denormalization suggestion:
>>
>> The key here for me is that customers can toggle orders on and off more 
>> than once, think of a subscription that can be paused at any time, and I 
>> want to be able to see for a given point in time which orders were active. 
>> If I have an active_at and inactive_at column those would work great if the 
>> order could only be one of those two, but since it can toggle I figured an 
>> `OrderStates` table was the best way to accomplish this.
>>
>> Is there another different / better way to do this kind of thing?
>>
>
> With PostgreSQL, a separate table containing a foreign_key to orders and a 
> tsrange column is probably the best way.  You can add a gist index on the 
> tsrange column, and find matching orders:
>
> DB.create_table(:order_active){foreign_key :order_id, :orders; tsrange 
> :active, :index=>{:type=>:gist}}
>
> Order.def_dataset_method(:active_at) do |time|
>   
> where(:id=>DB[:order_active].select(:order_id).where(Sequel.pg_range(:active).contains(time)))
> end
>
> The above requires the pg_range_ops extension, which ships with Sequel.
>
> As before, the example given is untested, but hopefully it can at least 
> point you in the right direction.
>
> Thanks,
> Jeremy
>

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.

Reply via email to