Rails: расставить приоритеты / отсортировать коллекцию записей - PullRequest
0 голосов
/ 04 августа 2011

У меня есть модель Post, принадлежащая одной категории и автору.Пользователи могут создавать «избранное» для категорий и авторов.Как я могу наиболее эффективно запросить список всех сообщений, но с предпочтительными категориями посетителя и / или авторами, отсортированными по началу?

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

1 Ответ

0 голосов
/ 04 августа 2011
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)

Альтернатива: меньше запросов, но модель пользователя выбирает данные из 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)

Этот код не проверен, но дает идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...