Hello,

Given:

- a Dealer model and controller
- index page with a search form on top and results shown below

Problem:

I'd like to select dealers based on keyword, status and program then
order them by name/launched_at asc/desc. The query joins in other tables
that are needed to perform the 'by keyword' part of the search, so I get
this error:

PGError: ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear
in select list
: SELECT DISTINCT dealers.* FROM "dealers"  LEFT OUTER JOIN contacts ON
(contacts.contactable_id = dealers.id)
                        LEFT OUTER JOIN w9_tax_forms ON
(w9_tax_forms.dealer_id = dealers.id) WHERE (LOWER(dealers.name) LIKE
'%dino%' or LOWER(contacts.email) LIKE '%dino%' or dealers.tax_id_code
LIKE '%dino%' or w9_tax_forms.tax_id_code LIKE '%dino%')  ORDER BY
LOWER(dealers.name) asc LIMIT 10 OFFSET 0

----------

dealers_controller.rb

   @dealers = Dealer.search(search_filters) # params

dealer.rb

    search = account.dealer_search_base # returns Dealer.scoped({}) in
this case

    search = search.with_keyword(keyword)
    search = search.with_status(options[:status_id])
    search = search.by_program(options[:program_id])
    search = search.order(options[:sort], options[:direction])

    paginate ? search.paginate(:page => page, :per_page => 10) :
search.all

scopes.rb

    named_scope :with_status, lambda { |status_id|
logger.debug("..with_status(#{status_id.to_i > 0})"); (status_id &&
status_id.to_i > 0) ? {:conditions => { :status_id => status_id } } : {}
}

    named_scope :with_keyword, lambda { |k| k.present? ? { :conditions
=> ['LOWER(dealers.name) LIKE ? or LOWER(contacts.email) LIKE ? or
dealers.tax_id_code LIKE ?  or w9_tax_forms.tax_id_code LIKE ?',
"%#{k.downcase}%", "%#{k.downcase}%", "%#{k}%",  "%#{k}%" ],  :joins =>
"LEFT OUTER JOIN contacts ON (contacts.contactable_id = dealers.id)
LEFT OUTER JOIN w9_tax_forms ON
(w9_tax_forms.dealer_id = dealers.id)",  :select => "DISTINCT dealers.*"
} : {} }

     named_scope :by_program, lambda { |program_id| program_id.present?
? { :conditions =>
             'dealers.program_id = ?', program_id] } : {} }

     named_scope :order, lambda {|sort, direction| {:order =>
"LOWER(dealers.#{sort}) #{direction},  dealers.status_id #{direction},
dealers.established #{direction}"} }

-------------

The problem is that PostgreSql requires the SELECT DISTINCT clause to be
followed by the ORDER BY criteria, so it needs to be inserted before the
joins take action. I don't know how to do this, if even possible.
Currently using Rails -v 2.3.8 and postgres (0.7.9.2008.01.28) gem.

Suggestions or ideas anyone?

-- 
Posted via http://www.ruby-forum.com/.

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to rubyonrails-t...@googlegroups.com.
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to