Я хотел бы поподробнее остановиться на этой задаче, потому что у неё есть несколько решений. Мы с Виталием общались на эту тему, но общего знаменателя у решений нет. Потому что, как и в любом практически применимом решении, есть плюсы и минусы у каждого из них.
Есть вопросы, у них есть ответы. Для каждого вопроса может существовать только один "лучший" ответ. Лучший ответ должен отрисовываться сразу после вопроса вне зависимости от хронологии поступления ответов.
Очевидно, что между вопросом и ответом есть связь
class Question < ApplicationRecord
has_many :answers
end
class Answer < ApplicationRecord
belongs_to :question
end
Больше всего нас интересуют решения следующих бизнес-задач:
Характеристика "лучший" - это свойство Ответа. Оно имеет булеву природу, либо ответ лучший, либо - нет. Пока ответ не выбран лучшим, он по умолчанию "не лучший". Отсюда следует, что нам нужно добавить колонку с таким свойством в базу в таблицу ответов.
Задача с выборкой на странице вопроса чудесным образом решается order'ом. При этом самым натуральным образом, лучший ответ будет первым
class Answer < ApplicationRecord
belongs_to :question
scope :sort_by_best, -> { order(best: :desc) }
end
class QuestionsController < ApplicationController
def show
@answers = @question.answers.sort_by_best
end
end
Задача с отрисовкой. Нам нужно отметить вопрос лучшим, если он является лучшим, тут тоже все предельно просто, но если у лучшего будет отдельный паршл, то либо их нужно будет вместе интегрировать, либо на каждом шаге спрашивать, является ли этот ответ лучшим.
- @answers.each do |answer|
= "Best" if answer.best
Задача с помечанием ответа лучшим, пожалуй самая сложная во всей этой истории. Поскольку у нас к моменту пометки ответа лучшим уже может быть выбран другой лучший ответ, то нам нужно то действие отменить, а это применить. Часто можно увидеть, что сначала находят какой конкретно ответ был до этого помечен правильным, но этого вовсе не обязательно делать