Разбивка данных из двух моделей в один канал новостей: Ruby on Rails 3 // Will_paginate - PullRequest
1 голос
/ 30 августа 2011

Я бы хотел сделать ленту новостей для домашней страницы сайта, с которым я играю.Есть две модели: статьи и сообщения.Если бы я хотел только один в новостной ленте, это было бы легко:

 @newsfeed_items = Article.paginate(:page => params[:page])

Но я хотел бы, чтобы оба были разбиты на страницы в одном и том же канале в обратном хронологическом порядке.Область действия по умолчанию для статьи и модели публикации уже в этом порядке.

Как мне объединить статьи и сообщения в ленту новостей как таковую?

Спасибо!

РЕДАКТИРОВАТЬ: Как насчет использования SQL в модели пользователей?

Просто интересно: может быть, можно было бы определить в User.rb:

 def feed
    #some sql like (SELECT * FROM articles....)
 end

Будет ли это работать вообще?

Ответы [ 5 ]

3 голосов
/ 16 января 2014

В моем последнем проекте я столкнулся с проблемой, мне пришлось разбить на страницы несколько моделей с одной нумерацией страниц в моей функциональности поиска. он должен работать таким образом, чтобы первая модель отображалась первой, когда результаты первой модели, вторая модель должны продолжать результаты, а третья и т. д. в виде единого поискового канала, как каналы Facebook. это функция, которую я создал, чтобы сделать эту функцию

def multi_paginate(models, page, per_page)

  WillPaginate::Collection.create(page, per_page) do |pager|

    # set total entries
    pager.total_entries = 0
    counts = [0]
    offsets = []
    for model in models
          pager.total_entries += model.count
          counts << model.count
          offset = pager.offset-(offsets[-1] || 0)
          offset = offset>model.count ? model.count : offset 
          offsets << (offset<0 ? 0 : offset)
    end

    result = []
    for i in 0...models.count
          result += models[i].limit(pager.per_page-result.length).offset(offsets[i]).to_a
    end

    pager.replace(result)
  end

end

попробуйте и дайте мне знать, если у вас есть какие-либо проблемы с этим, я также опубликовал это как проблему в репозиторий will_paginate, если все подтвердят, что он работает правильно, я раскошелюсь и передам его в библиотеку. https://github.com/mislav/will_paginate/issues/351

2 голосов
/ 21 октября 2011

для тех, кто заинтересован, пожалуйста, проверьте этот вопрос: Создание "подачи" из нескольких моделей рельсов, эффективно?

Здесь Victor Piousbox предлагает хорошее, эффективное решение.

1 голос
/ 30 августа 2011

Посмотрите на метод paginate_by_sql.Вы можете написать запрос unione для получения как статей, так и сообщений:

select 'article' as type, id from articles
  union
select 'post' as type, id from posts
0 голосов
/ 30 августа 2011

Вы можете разбить массив на части с помощью WillPaginate :: Collection.create. Поэтому вам нужно использовать ActiveRecord, чтобы найти оба набора данных, а затем объединить их в один массив.

Затем посмотрите на https://github.com/mislav/will_paginate/blob/master/lib/will_paginate/collection.rb документацию о том, как использовать коллекцию для разбивки на любой массив.

0 голосов
/ 30 августа 2011

Вы можете разбить оба на страницы, если используете AJAX. Здесь хорошо объясняется, как разбивать на страницы с помощью AJAX с WillPaginate.

...