Имеет много помощи в отношениях на рельсах - PullRequest
0 голосов
/ 04 июня 2010

У меня есть две модели вопросов и ответов.и на вопрос has_many ответы.Как я могу узнать все вопросы, на которые нет ответа?

Ответы [ 3 ]

5 голосов
/ 04 июня 2010

Я бы предложил добавить :counter_cache к Answer модели. Тогда вы можете сделать что-то подобное в Question модель

class Question < ActiveRecord::Base
  has_many :answers
  named_scope :unanswered, :conditions => {:answers_count => 0}
end

Модель Answer будет выглядеть так

class Answer < ActiveRecord::Base
  belongs_to :question, :counter_cache => true
end
2 голосов
/ 04 июня 2010
class Question < ActiveRecord::Base
  has_many :answers

  def self.unanswered
    find_by_sql("select * from questions where id not in (select DISTINCT question_id from answers) ORDER BY updated_at DESC")
  end
end

class Answer < ActiveRecord::Base
  belongs_to :question
end

В контроллере

@unanswered= Question.unanswered

ДЛЯ СТРАНИЦЫ

  def self.unanswered
    find_by_sql("select * from questions where id not in (select DISTINCT question_id from answers) ORDER BY updated_at DESC")
  end


@unanswered= Question.unanswered
@unanswered.paginate(:page => params[:page], :per_page => 10)

Как получить все записи, а затем использовать нумерацию страниц.

  def self.unanswered(page_no=1, per_page=10)
    find_by_sql("select * from questions where id not in (select DISTINCT question_id from answers) ORDER BY updated_at DESC").paginate(:page => page_no, :per_page => per_page)
  end


@unanswered= Question.unanswered(params[:page], params[:per_page])
1 голос
/ 04 июня 2010

Если вы собираетесь использовать прямой подход SQL, описанный Salil, а не более ActiveRecord подход, предложенный Eimantas, тогда вы можете использовать следующий SQL

SELECT * FROM questions as q 
WHERE NOT EXISTS (SELECT * FROM answers AS a WHERE a.question_id = q.id)

В отличие от

select * from questions 
where id not in (select DISTINCT question_id from answers)

Первый запрос выполнялся для меня в 8 раз быстрее для таблицы из 140000 строк, причем 10% строк не имели ответа. Я ожидаю, что это будет варьироваться от двигателя к двигателю в зависимости от% оставшихся без ответа вопросов.

Решение Eimantas хорошо, если вы создадите столбец с именем answers_count в таблице вопросов, тогда ActiveRecord сохранит это для вас, и это должно быть очень быстро.

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