Заказ результатов запроса условно - PullRequest
0 голосов
/ 20 сентября 2018

Я должен повторить это снова, так как мой последний ответ на сообщения не был реальным решением:

У меня есть Сообщения и Комментарии в моем приложении Rails.Я хочу отображать сообщения, упорядоченные по последним действиям, то есть сообщения с последним комментарием идут первыми.

У меня есть этот SQL и несколько проблем на данный момент:

Post.left_outer_joins(:comments).
order('comments.created_at DESC, posts.created_at DESC').
uniq

Как вы можете видетьон объединяет две таблицы, упорядочивает результаты и выбирает из них уникальные записи

Проблемы:

  • Если у сообщений нет комментариев, тогда эти сообщения всегда отображаются первыми в нисходящем порядкеПорядок их создания, но я хочу, чтобы сообщения были в порядке недавней активности.

Так же, как форум, который сортирует сообщения пользователей после недавних действий в них

Я хотел бы объединить столбцы comments.created_at и posts.created_at в столбец posts.created_at со значением:

  • comments.created_at, если не ноль, то еще
  • posts.created_at, есликомментариев нет

и затем заказывайте весь запрос после posts.created_at

Буду очень признателен за помощь в решении этой проблемы, спасибо

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

app / models / post.rb

class Post < ApplicationRecord
  has_many :comments
end

app / models / comment.rb

class Comment < ApplicationRecord
  belongs_to :post
end

db / schema.rb

ActiveRecord::Schema.define(version: 2018_09_20_081230) do

  create_table "comments", force: :cascade do |t|
    t.text "comment_content"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "post_id"
  end

  create_table "posts", force: :cascade do |t|
    t.string "post_title"
    t.text "post_content"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

end

Запрос

Post.includes(:comments).order('comments.created_at DESC')

Тестовая среда:

  • Рубин 2.3.5

  • Рубин 5.2.1

ОБНОВЛЕНИЕ

Post.joins('LEFT JOIN comments ON comments.post_id = posts.id').group('posts.id').order('COALESCE(MAX(comments.created_at), posts.created_at) DESC')

или

Post.find_by_sql('SELECT posts.* FROM posts LEFT JOIN comments ON comments.post_id = posts.id GROUP BY posts.id ORDER BY COALESCE(MAX(comments.created_at), posts.created_at) DESC')
0 голосов
/ 20 сентября 2018

Что вы можете сделать в этом случае, это отсортировать по максимуму.

Post.left_outer_joins(:comments).
order('GREATEST(comments.created_at, posts.created_at) DESC').
uniq
0 голосов
/ 20 сентября 2018

Я только что сделал в Ruby:

@posts = Post.where(category: params[:category])
@posts.each do |p|
  p.created_at = p.comments.count == 0 ? p.created_at : p.comments.last.created_at
end
@posts = @posts.sort_by { |k| k[:created_at] }.reverse
@posts = @posts.paginate(page: params[:page])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...