Is there a better way to do this search?

Here’s the situation…

:customer has_many :billing_windows
:billing_window belongs_to :customer

A billing_window can either be open or closed (it is considered open
until its closed_on attribute is set to a datetime). I’m trying to
refactor the class method on Customer that finds all customers with at
least 1 open billing_window. Currently it looks like this…

def self.has_open_billing_window
set = []
Customer.find(:all).each do |customer|
set << customer if customer.billing_windows.find(:all, :conditions
=> [:open => true]).size > 0
end
set
end

For obvious reasons, this is horribly inefficient so I have refactored
that code to:

def self.has_open_billing_window
Customer.find(:all, :joins => :billing_windows, :conditions =>
“billing_windows.closed_on IS NULL”)
end

This definitely seems cleaner but I don’t like the fact that the
conditions clause is specific to the database query language. Does
anyone know a better way to accomplish this?

Bob

Bob wrote:
[…]

For obvious reasons, this is horribly inefficient so I have refactored
that code to:

def self.has_open_billing_window
Customer.find(:all, :joins => :billing_windows, :conditions =>
“billing_windows.closed_on IS NULL”)
end

This definitely seems cleaner but I don’t like the fact that the
conditions clause is specific to the database query language.

The clause isn’t specific to the DB query language. It contains only
standard SQL, and so should work perfectly in any SQL database.

Granted, it won’t necessary work in a non-SQL database, but those are
typically structured very differently from SQL databases anyway.

Does
anyone know a better way to accomplish this?

You don’t need one.

Bob

Best,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]