Filtering find by values in associated models?

Given

class Customer
belongs_to :invoice_address, :class_name => “Address”, …
belongs_to :delivery_address, :class_name => “Address”, …
belongs_to :contact, :class_name => “Employee”, …
end

How would you go about filtering a find :all where e.g.
invoice_address.city = “Oslo”, delivery_address.zip = 1234 and
contact.department = 14?
Exactly which and how many fields we want to filter on is highly
dynamic. Doing it in the db is a must.

Suggestions?

eager loading of associations should get in the right direction:

Customer.find(:all, :include => [:invoice_address, :delivery_address,
:contact], :conditions => [“Address.city=? AND Address.zip=? AND
contact.department=?”, “Oslo”, 1234, 14])

but this example wouldn’t do exactly what you want, since it’s mixing
invoice & delivery address.
it will take some work, to set this up the right way, maybe get a
working sql solution first.

On Wed, Apr 9, 2008 at 3:19 PM, Thorsten M.
[email protected] wrote:

working sql solution first.
We’re currently thinking of feeding :joins an sql fragment along the
lines of:
conditions.keys.substring(".") do |alias|
“inner join <alias_to_table_name> as on (.id =
customer._id)”
end.join(" ")

Which would use a condition hash like:
{“invoice_address.city” => “Oslo”, “delivery_address.zip” => “1234”,
…}

Unless someone can come up with a better approach.

I must be missing something.

Why can’t you simply eager-load the associations and do your
“invoice_address.city” => “Oslo” type conditions?

Julian.

Learn Ruby on Rails! Check out the FREE VIDS (for a limited time)
VIDEO #3 out NOW!
http://sensei.zenunit.com/

On 11 Apr 2008, at 00:41, Julian L. wrote:

I must be missing something.

Why can’t you simply eager-load the associations and do your
“invoice_address.city” => “Oslo” type conditions?

Because the table addresses is joined twice you’d need to know what it
was aliased as.

Fred

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs