Сложность сортировки записей на основе атрибутов связанных моделей.

У меня возникли проблемы с реализацией функции, которая позволяет пользователям видеть вопросы (моя модель), отсортированные или отфильтрованные на основе различных атрибутов, принадлежащих ей (например, был ли ответ на вопрос? сколько ответов на вопрос и т. д.), который будет основан на Question атрибуты модели или атрибуты связанных моделей в Question.

У меня есть следующие модели:

class Question < ActiveRecord::Base    
  belongs_to :course
  belongs_to :user
  has_many :answers, inverse_of: :question
  belongs_to :accepted_answer, class_name: :answer, foreign_key: :accepted_answer_id

  default_scope order: 'questions.created_at DESC'
end

class Answer < ActiveRecord::Base
  belongs_to :user
  belongs_to :question, inverse_of: :answers
  has_many :a_votes

  default_scope order: 'answers.created_at DESC'

  def accepted?
    return false if new_record? 
    question.try( :accepted_answer_id ) == id
    # an alternative is to use question.try( :accepted_answer ) == self
  end
end

Я бы добавил сортировку или фильтры в контроллере, такие как «Просмотреть только отвеченные вопросы», где только вопросы с question.accepted_answer == true. Каков наилучший способ добиться этого? И есть ли какие-либо руководства по фильтрации/сортировке ActiveRecord, которые я мог бы использовать для дальнейшего использования?

Спасибо!!

Приложение

Я показываю вопросы в том виде, в котором они отображаются _question.html.erb, и вызываю их через функцию show родителя вопроса, Group (таким образом, каждый Group будет has_many вопросов)

class CoursesController < ApplicationController
  def show
    @course = Course.find(params[:id])
    # @questions = @course.questions.all this is the default selection
    @questions = @course.questions.by_answer_count #maybe Im not calling the scope correctly (and sorry if I am making a noob mistake..)
  end
  #There are other methods not shown
end

person daspianist    schedule 31.01.2013    source источник
comment
Я не знаю, действительно ли это то, что вы ищете, но изучите: github.com/ernie/ransack - Разграбить драгоценный камень не помешало бы   -  person Martin Lang    schedule 01.02.2013
comment
@MartinLang это выглядит действительно круто, и я могу согласиться с этим, я не могу заставить работать свою собственную логику сортировки / фильтрации. Спасибо, что поделились этой крутой жемчужиной.   -  person daspianist    schedule 01.02.2013


Ответы (1)


Я добиваюсь такого рода вещей, определяя область действия родительской модели с помощью объединений и группировок.

Например, в этой области вопросы будут упорядочены по количеству ответов (по убыванию).

class Question
  scope :by_answer_count, -> {
    joins(:answers).reorder("count(answers.id) DESC").group(:id)
  }
end

Надеюсь, это поможет.

person Shane    schedule 31.01.2013
comment
Спасибо, что поделились своим ответом, Шейн. Пока код выполняется, к сожалению, порядок того, что отображается, совсем не меняется. Я даже попробовал это после того, как раскомментировал свой default_scope, чтобы сначала показать, что создано последним. Я вставил больше кода в тело вопроса на случай, если это поможет. - person daspianist; 01.02.2013
comment
Да, я не знал, что для Question есть область действия по умолчанию. Вместо этого этот метод должен использовать reorder. Я отредактировал его соответствующим образом. Дай мне знать, если это работает. - person Shane; 01.02.2013
comment
Спасибо за редактирование .. к сожалению, все еще не работает. Я хочу убедиться, что способ, которым я вызываю его в контроллере, правильный: @questions = @course.questions.by_answer_count. На мой взгляд, я тогда звоню render @questions. - person daspianist; 01.02.2013
comment
Это выглядит правильно для меня. Попробуйте открыть консоль rails console и выполнить Course.find(id).questions.by_answer_count и посмотреть, применяется ли предложение порядка к оператору SQL. - person Shane; 01.02.2013
comment
Отличный совет по отладке. Я получаю ошибку неопределенного метода `by_answer_count' при выполнении запроса в консоли rails. - person daspianist; 01.02.2013
comment
Получил работу! Кто-то не использовал функцию index на курсах, поэтому она не применялась к контроллеру. Спасибо еще раз - person daspianist; 01.02.2013