Question

Currently, I'm doing the conditions in the view. I need to do it in model or controller, but haven't found a way to do it that works.

I have a view rendering 10 users via a partial that sorts them by their friends count (all examples simplified):

Index.html.erb

<%= render @users %>

_partial.html.erb

<% unless current_user == user or current_user.friending?(user) %>
  <%= user.name %>
<% end %>

models/user.rb

scope :top, :order => "friends_count DESC"

users_controller.rb/index

@users = User.top.limit(10)

But in my case, it checks the validations in the partial for each user. How can I do it more effectively in the scope or controller and check for all?

Thanks greatly for all answers. Hugely appreciated.

Was it helpful?

Solution

class User
  scope :top, order("friends_count DESC")
  scope :skip_user, lambda{|user| where("id != ?", user.id) }
  scope :skip_user_friends, lambda{|user| where("friend_id != ?", user.id }
end

users_controller.rb

@users = User.top.skip_user(current_user).skip_user_friends(current_user).limit(10)

OTHER TIPS

When you're getting your @users in the controller, you can use #select.

@users = User.top.reject { |user| current_user == user or current_user.friending?(user) }.limit(10)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top