Как получить данные из 2 таблиц?

#ruby-on-rails

#ruby-on-rails

Вопрос:

Я хочу получить id s респондентов, которые не ответили ни на один вопрос. Как мне этого добиться?

Ниже приведены мои модели и их взаимосвязи друг с другом.

Модель ответа (поля: id, inquiry_id, текст):

 class Answer < ActiveRecord::Base
  belongs_to :inquiry
  belongs_to :question
  has_one    :respondent,   :through => :inquiry

  validates_uniqueness_of :inquiry_id
  validates_presence_of   :text
end
  

Модель респондента (поля: id, email, user_id):

 class Respondent < ActiveRecord::Base
  has_many :inquiries, :dependent => :destroy
  has_many :questions, :through => :inquiries
  belongs_to :user

  validates_uniqueness_of :email
  validates_presence_of :email
end
  

Модель запроса (поля: id, question_id, responsent_id):

 class Inquiry < ActiveRecord::Base
  belongs_to  :question
  belongs_to  :respondent
  has_one    :answer, :dependent => :destroy
  

Модель вопроса (поля: идентификатор, текст):

 class Question < ActiveRecord::Base
  has_many :inquiries, :dependent => :destroy
  has_many :answers, :through => :inquiries, :dependent => :destroy
  belongs_to :user
end
  

Ответ №1:

В зависимости от контекста, в котором вы хотите получить эти данные, и предполагая, что у вас не слишком много респондентов и вопросов, вы могли бы сделать следующее. Это предполагает, что у вас есть метод с именем answered? в вашей модели вопроса, которая возвращает true, если получен ответ на вопрос.

 respondents = [] 
Respondent.all.each do |respondent|

  total_questions = respondent.questions.count
  answered_questions = 0

  unless total_questions < 1   
    respondent.questions.each do |q|
      q.answered? ? answered_questions   : nil
    end
  end

  if answered_questions == 0
    respondents << respondent
  end
end
  

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

Комментарии:

1. Спасибо, но извините, я новичок в rails, rails выдает ошибку в строке ‘q.ответили? ? ответы на вопросы : ноль’ … в чем проблема? И я что должен написать в представлении?

2. код, который я написал, является примером кода, поэтому предполагается, что есть ответ? метод в вашей модели вопроса, который проверяет, был ли получен ответ на вопрос, и если он есть, возвращает true, в противном случае он возвращает false.