umezo
umezo

Reputation: 1579

How to set default_scope order on attribute from another unassociated model

I have a Search resource that returns posts based on a filter as described in Railscast111, and have the following code:

def filter_posts
  posts = Post.order('created_at DESC')     
  posts = posts.where("name ilike ?", "%#{keywords}%")
  posts = posts.where(... #numerous other filters
  posts
end

The filter itself seems to work fine. However, the content is not always returned in order of 'created_at DESC'. How can I sort the final output so that it's always in order of 'created_at DESC'? Currently, there is no association between the Post and Search models. Do I need to build one? If so, how?

Upvotes: 0

Views: 152

Answers (1)

ply
ply

Reputation: 1141

Have you tried chaining the two conditions together?

posts = Post.where("name like?", "%#{keywords}%").order('created_at DESC')

Depending on how many filters you end up calling, you'll need to keep updating your original result, with the updated scope (based on your filter), as each time you use where it creates a new scope, instead of adjusting the original one. So you seem to be on the right path, as your original code does this, e.g

posts = Post.where("filter1")
posts = posts.where("filter2")

Have you tried sorting after all of the filters have been applied, so something like

posts = posts.order('created_at DESC')   

or

posts = posts.sort_by &:created_at

Also, I'm not really sure what you mean by a Search resource, when (at least in this case) it appears you could keep the search logic within the Post model itself. Can you clarify, or maybe post the model?

Upvotes: 1

Related Questions