Forum: Ruby on Rails ActiveRecord Nested Conditions Improvements Suggestion

Announcement (2017-05-07): is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see and for other Rails- und Ruby-related community platforms.
6cd0fbceeb72252acd2f8a1e35d78ab5?d=identicon&s=25 Zyclops (Guest)
on 2009-03-15 12:19
(Received via mailing list)
I'm not satisfied with how rails currently handles finds accross
active record models, and want to see if there's a waywe can improve

The ability to generate dynamic search criteria from forms that search
accross models can be quite difficult except in the simplest cases.
The main cause of this is because as a developer you have to work out
what the table name is going to be called before you are able to use

Here is an example:

class Person < ActiveRecord::Base

  # Everybody has a home address
  belongs_to :home_address,
             :class_name  => 'Address',
             :foreign_key => 'home_address_id'

  # Only some people have a work address
  belongs_to :work_address,
             :class_name  => 'Address',
             :foreign_key => 'work_address_id'

class Address < ActiveRecord::Base

Lets say we have a search panel, that allows you to filter on home
address street name, and work address street name and the user may or
may not use these search options.

# A search for the home address 22
Person.find(:all, :joins =>
[:home_address, :work_address], :conditions => {:address =>
{:street_no => 22}})

# A search for the work address 22
Person.find(:all, :joins =>
[:work_address, :home_address], :conditions => {:address =>
{:street_no => 22}})
#Notice that the order of the joins affects what the conditions hash
applies too. I believe this unintuitive.

# I think a better system would be to use the names of the
relationships to dictate the search criteria
# This would stop the user having to guess what the join table is

Person.find(:all, :joins =>
[:work_address, :home_address], :conditions => {:home_address =>
{:street_no => 22}})

# If this could be developed I would think we'd need to cover these
# 1. Eager loading using inner join
Person.find(:all, :joins =>
[:work_address, :home_address], :conditions => {:home_address =>
{:street_no => 22}})

# 2. Eager loading using left join
# Notice that the home_address has conditions specified so in this
case we might want to enforce a left join
Person.find(:all, :include =>
[:work_address, :home_address], :conditions => {:home_address =>
{:street_no => 22}})

# 3.No eager loading specified (would we force a join because of the
conditions specified?)
Person.find(:all, :conditions => {:home_address => {:street_no =>

# 4. Custom SQL for each nesting, so that you can use any sql but not
have to explicitly know the name of the table
  :joins => :home_address
  :conditions => [
     {:age => 22},
     # This would currently conflict with the currect nested hash
     {:home_address => ['home_address.street_name LIKE ?', 'Dougla%']}

# 1. Joins
# FROM people
# JOIN addresses home_address ON (people.home_address_id =
# WHERE people.age = 22 AND
#       home_address.street_name LIKE 'Dougla%'

# 2. Left Joins (:include)
# FROM people
# WHERE people.age = 22
# FROM addresses home_address
# WHERE home_address.street_name LIKE 'Dougla%'
# AND IN (1,2,3,4,5,6,7,8,9,10)

I'd like to hear your thoughts and ideas on any inherent problems with
getting this implemented, or design improvements.

It's only an idea at this stage, but I'd like to develop it so that
developing complex dynamic searches using rails
becomes trivial.
872535e214a9e3a98889bd8d069f0294?d=identicon&s=25 "Wolas!" (Guest)
on 2009-03-16 12:27
(Received via mailing list)
i would post it in the rails core group.
6cd0fbceeb72252acd2f8a1e35d78ab5?d=identicon&s=25 Zyclops (Guest)
on 2009-03-16 13:39
(Received via mailing list)
cheers, i made it a bit more clear and posted it in rails core
This topic is locked and can not be replied to.