Создание метода в модели, который возвращает новый экземпляр с заполненными дочерними элементами 'has_many through' - PullRequest
1 голос
/ 19 апреля 2019

Первый раз что-то строил с Ruby on Rails и немного потерял при реализации "has_many through"

В этом приложении у меня есть Вопросы, DailyQuestionSets (для каждого дня будет один DailyQuestionSet) и DailyQuestions (таблица ссылок «многие ко многим», так что DailyQuestionSets может иметь несколько Вопросов.

(я понимаю, что эти названия таблиц / моделей плохие, любые предложения по улучшению приветствуются:)

Я застрял на шаге создания метода в приложении DailyQuestionSet с именем get_today_dailyquestionset, который отправляется в базу данных, чтобы посмотреть, существует ли DailyQuestionSet для этого дня, если нет, то создайте его и верните его Свойство .questions, заполненное всеми вопросами из базы данных.

(позже я изменю это с получения всех вопросов на выбор 3 случайных вопросов каждый день)


class Question < ApplicationRecord
  has_many :dailyquestions, foreign_key: 'dailyquestion_id'
  has_many :dailyquestionsets, :through => :dailyquestions
  default_scope -> { order(created_at: :desc) }
end

class DailyQuestion < ApplicationRecord
  belongs_to :daily_question_set
  belongs_to :question
end

class DailyQuestionSet < ApplicationRecord
  has_many :daily_questions, foreign_key: 'question_id'
  has_many :questions, :through => :daily_questions, :source => :question

  def self.get_today_dailyquestionset

    @dailyquestionset_list = DailyQuestionSet.where('posed_date BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day).all

    if @dailyquestionset_list.count == 0

      @dailyquestionset = DailyQuestionSet.new(posed_date: DateTime.now)

      @dailyquestionset.save

    end

    @questionlist = Question.all

    @questionlist.each do |q|
      @dailyquestionset.questions << q

    end    
    return @dailyquestionset_list[0]  
  end  
end

Я получаю эту ошибку, которая, как я понимаю, означает, что объекты Question, возвращаемые из Question.all, не имеют набора DailyQuestionSet, связанного с ними. Что имеет смысл. Но я не могу найти способ создать отношение «многие ко многим» для каждого вопроса, прежде чем добавить его в массив .questions.

ERROR["test_create_daily_daily_question_set_if_not_already_existing", DailyQuestionSetTest, 1.0837379119993784]
 test_create_daily_daily_question_set_if_not_already_existing#DailyQuestionSetTest (1.08s)
ActiveRecord::RecordInvalid:         ActiveRecord::RecordInvalid: Validation failed: Daily question set must exist
            app/models/daily_question_set.rb:20:in `block in get_today_dailyquestionset'
            app/models/daily_question_set.rb:19:in `get_today_dailyquestionset'
            test/models/daily_question_set_test.rb:11:in `block in <class:DailyQuestionSetTest>'

1 Ответ

0 голосов
/ 19 апреля 2019

Да, принадлежит_, проверяет, существует ли ассоциация. Вы должны добавить необязательно: true, если вы не хотите это

class DailyQuestion < ApplicationRecord
  belongs_to :daily_question_set, optional: true
  belongs_to :question, optional: true
end

https://github.com/rails/rails/issues/34454

Вы должны проверить, что

@dailyquestionset.save

возвращает true, в противном случае проверка может не пройти. Или используйте сохранить! поднять исключение.

Кроме того, если @dailyquestionset_list.count > 0, то @dailyquestionset равно нулю.

p.d .: рад помочь, если вы предоставите больше информации p.d.d: есть тип в

 @dailyquestionset_list = DailyQuestionSet.where('posed_date BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day).all

Я думаю, это должно быть posted_dated

и

@dailyquestionset = DailyQuestionSet.new(posed_date: DateTime.now)

Но это зависит от схемы.

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