Sklejanie conditions

Wygląda to tak:
Chcemy wyświetlić użytkowników, którzy dołączyli do konkursy, mają avatar i więcej niż 5 zdjęć, w widoku potrzebujemy ich miasto, a dodatkowo możemy pobierać facetów lub kobitki i/lub brać ich z konretnej grupy wiekowej konkursu. Efektem jest to co widać, ktoś ma jakiś pomysł, żeby to było bardziej przyjazne?

[code]
conditions = {:conditions => [“activities.action = ? AND avatar_id is not null”,‘new_in_contest’],
:joins => [:activities, :photos], :group => “users.id”, :having => “COUNT(photos.id) > 5”,
:include => {:user_addresses => :city}, :order => “activities.created_at DESC”,
:per_page => 96, :page => params[:page] || 1}
if params[:gender]
conditions[:conditions][0] += " and users.gender = ?"
conditions[:conditions] << params[:gender]
end
if params[:group] && !params[:group].eql?(“0”)
conditions[:joins] << {:user_sexiest_contests => :sexiest_contest}
conditions[:conditions][0] += " and sexiest_contests.age_group = ?"
conditions[:conditions] << params[:group]
end

@users = User.paginate(conditions)[/code]

Tak na wstępie to przenieś warunki do modelu - named_scope i je wywoływać w if’ach, a na wyniku dać paginacje

To co napisał Piotr Misiurek może (ale nie musi) wyglądać mniej więcej tak:

[code=ruby]class User

named_scope :by_action, lambda { |name|
{ :conditions => [“activities.action = ?”, name], :joins => :activities}
}
named_scope :with_avatar, :conditions => “avatar_id IS NOT NULL”
named_scope :with_more_photos_than, lambda { |number|
{ :joins => :photos, :having => [“COUNT(photos.id) > ?”,number]}
}
named_scope :by_gender, lambda { |gender|
{ :conditions => { :gender => gender }}
}
named_scope :by_age_group, lambda { |age_group|
{ :joins => { :user_sexiest_contests => :sexiest_contest}, :conditions => [“sexiests_contests.age_group = ?”, age_group]}
}
end

kontroler:

@users = User.by_action(“new_in_contest”).with_avatar
@users = @users.by_gender(params[:gender]) unless params[:gender].blank?
@users = @users.by_age_group(params[:group]) if params[:group] && !params[:group].eql?(“0”)
@users = @users.with_more_photos_than(5).paginate(:include => { :user_addresses => :city}, :group => “users.id”, :order => “activities.created_at DESC”, :per_page => 96, :page => params[:page])[/code]
Możesz też skorzystać z plugin’a Searchlogic który automatycznie tworzy cały zestaw named_scope’ów.