Max, How about something like...
:order=>"(CASE WHEN tags.name = 'piano' THEN 1 ELSE 0 END) desc, tags.name", Anthony Crumley http://commonthread.com On Mon, Apr 12, 2010 at 10:02 AM, Max Williams <[email protected]> wrote: > Hey all. I'm doing a paginated find with will_paginate, with a fairly > complex set of associations and ordering clauses. > > Here's the associations relevant to this example: > > Question > belongs_to :subject > #standard acts_as_taggable setup > has_many :taggings, :conditions => ["taggable_type => ?", "Question"] > has_many :tags, :through_taggings > > What i'm trying to do, is, for a given tag, order the results so that > the ones with that tag are at the top, and then the other ones in > alphabetical order. > > Here's an example of one of the generated find calls: > > Question.find(:all, {:per_page=>30, > :conditions=>["questions.subject_id = ?", "9"], > :page=>1, > :order=>"(tags.name = 'piano') desc, tags.name", > :include=>[:subject, {:taggings=>:tag}]}) > > For the resultant sql, rails splits it into two sql calls. The first > uses just the associations referred to in the order list, and gets the > ids of the questions. This is where the problem is occurring: here's > the first sql which rails generates: > > SELECT DISTINCT `questions`.id FROM `questions` LEFT OUTER JOIN > `taggings` ON `taggings`.taggable_id = `questions`.id AND > `taggings`.taggable_type = 'Question' LEFT OUTER JOIN `tags` ON > `tags`.id = `taggings`.tag_id WHERE (questions.subject_id = '9') ORDER > BY (tags.name = 'piano') desc, tags.name LIMIT 0, 30 > > I can copy and run this myself in mysql and see that it's not having the > desired result: the 30 question ids that it brings back don't belong to > questions which have the 'piano' keyword. > > I think that this is a grouping issue, or something similar: i think the > 'distinct questions.id' part is interacting with the joined table of > questions and taggings in such a way as to cut out the right ids. I > think that if i had a working version of the above sql query i could > work backwards and set up my find options appropriately. > > Any advice, anyone? thanks, max > -- > 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 [email protected]. > To unsubscribe from this group, send email to > [email protected]<rubyonrails-talk%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/rubyonrails-talk?hl=en. > > -- 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 [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

