2011-08-04 4 views
0

J'ai un modèle Post qui appartient à une seule catégorie et auteur. Les utilisateurs peuvent créer des "favoris" pour les catégories et les auteurs. Comment puis-je interroger plus efficacement une liste de tous les messages, mais avec les catégories préférées du visiteur et/ou les auteurs triés en haut?Rails: Prioriser/trier la collection d'enregistrements

class Post < ActiveRecord::Base 

    belongs_to :category 
    belongs_to :author 

end 

class Favorite < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :category # favorite category 
    belongs_to :author # favorite author 

end 

class User < ActiveRecord::Base 

    has_many :favorites 

end 
+0

Avez-vous un booléen préféré ou voulez-vous le plus complexe où il les évalue automatiquement? S'il vous plaît donner plus d'informations. –

+0

Non, pas booléen pour préféré. Il doit utiliser le modèle favori pour déterminer quels messages sont préférés, en fonction de la catégorie/auteur de la publication et de la catégorie/auteur "privilégié" de cet utilisateur spécifique. – imderek

Répondre

0
class User < ActiveRecord::Base 
    has_many :favorites 

    has_many :favorite_categories, :through => :favorites, :source => :category 
    has_many :favorite_authors, :through => :favorites, :source => :author 
end 

class Favorite < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :category # favorite category 
    belongs_to :author # favorite author 
end 

class Post < ActiveRecord::Base 
    belongs_to :category 
    belongs_to :author 

    named_scope :order_by_user, lambda {|user| where(
    :category_id => user.favorite_categories.map(&:id), 
    :author_id => user.favorite_authors.map(&:id) 
)} 
end 

user = User.first 
posts = Post.order_by_user(user) 

Autre: moins nombre de requêtes, mais le modèle de l'utilisateur récupère des données de Favorite

class Favorite < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :category # favorite category 
    belongs_to :author # favorite author 
end 

class User < ActiveRecord::Base 
    has_many :favorites 

    def favorite_category_ids 
    Favorite.where(:user_id => self.id).select(:category_id).map(&:category_id).compact 
    end 

    def favorite_author_ids 
    Favorite.where(:user_id => self.id).select(:author_id).map(&:author_id).compact 
    end 
end 

class Post < ActiveRecord::Base 
    belongs_to :category 
    belongs_to :author 

    named_scope :order_by_user, lambda {|user| where(
    :category_id => user.favorite_category_ids, 
    :author_id => user.favorite_author_ids 
)} 
end 

user = User.first 
posts = Post.order_by_user(user) 

Ce code n'a pas été testé, mais donne l'idée.

+0

Brillant. Je vous remercie. – imderek

Questions connexes