Rails 5 временных меток не работает для has_many через модель - PullRequest
1 голос
/ 28 октября 2019

[ TLDR: Проверьте свои приборы! (см. ответ ниже)]

gem 'rails', '5.2.3'

У меня есть две модели, Люди и Щенки, которые имеют отношение has_many "через". Модель соединения - Companion.

class Person < ApplicationRecord
    has_many :companions, -> { order(created_at: :asc) }
    has_many :puppies, through: :companions

class Puppy < ApplicationRecord
    has_many :companions
    has_many :people, through: :companions

class Companion < ApplicationRecord
    self.table_name = 'people_puppies' #is the table name messing things up?
    belongs_to :person
    belongs_to :puppy
    default_scope { order(created_at: :asc) }

Моя проблема в том, что отметки времени created_at и updated_at не работают в модели Companion. Когда я пытаюсь назначить новую связь между двумя записями ...

    @person.puppies << some_puppy
    # or
    @person.companions << some_puppy
    # or
    Companion.create!(puppy: some_puppy, person: @person)

... я получаю сообщение о нарушении ограничения БД:

ActiveRecord::NotNullViolation: SQLite3::ConstraintException: NOT NULL constraint failed: people_puppies.created_at: INSERT INTO "people_puppies" ("person_id", "puppy_id") VALUES (1052040621, 904095534)

Почему Rails не добавляетметки времени?

Вот схема:

  create_table "people_puppies", force: :cascade do |t|
    t.integer "person_id", null: false
    t.integer "puppy_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["person_id", "puppy_id"], name: "index_people_puppies_on_person_id_and_puppy_id"
    t.index ["puppy_id", "person_id"], name: "index_people_puppies_on_puppy_id_and_person_id"
  end

1 Ответ

1 голос
/ 28 октября 2019

WOOPS!

Нарушение ограничения БД на самом деле не было результатом << или моего тестового кода вообще. У меня были ассоциации в моих приборах, которые остались до того, как я преобразовал из has_and_belongs_to_many в has_many through:

Пример:

some_person:
  email: foo@gmail.com
  puppies:
     - some_puppy

^ Это то, что вызывало ошибку БД перед моим тестомКод даже начался. : - /

Мой первоначальный вопрос был основан на неправильных предположениях, но это, кажется, простая ошибка, если вы сделаете рефакторинг с HABTM на has_many through (и у вас уже есть существующие приборы). Поэтому, хотя это неловко, я оставлю этот вопрос на случай, если это поможет кому-то в будущем.

...