Множественный принадлежат has_many между двумя моделями: SQLException: нет такой таблицы - PullRequest
0 голосов
/ 15 октября 2018

У меня есть две модели, связанные между собой двумя has_many / belongs_to ассоциациями с внешним ключом, но у меня возникли некоторые проблемы с сохранением любого объекта боя.

Вот мои модели:

Fight.rb

belongs_to :winner, class_name: 'Fighter', foreign_key: :winner_id, inverse_of: 'winned_fights'
belongs_to :looser, class_name: 'Fighter', foreign_key: :looser_id, inverse_of: 'loosed_fights'

Fighter.rb

has_many :winned_fights, class_name: 'Fight', foreign_key: :winner_id, inverse_of: 'winner'
has_many :loosed_fights, class_name: 'Fight', foreign_key: :looser_id, inverse_of: 'looser'

дБ / схема.rb

create_table "fights", force: :cascade do |t|
  ...
  t.integer "winner_id"
  t.integer "looser_id"
  t.index ["looser_id"], name: "index_fights_on_looser_id"
  t.index ["winner_id"], name: "index_fights_on_winner_id"
end

create_table "fighters", force: :cascade do |t|
  t.string "name"
  ...
end

Вот что происходит, когда я пытаюсь сохранить объект Fight:

ActiveRecord::StatementInvalid (SQLite3::SQLException: no such table: main.loosers: INSERT INTO "fights" ("winner_punches", "looser_punches", "victory_type", "rounds", "winner_id", "looser_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?)):

Вот запрос SQL, который не выполняется:

Fight Create (1.5ms)  INSERT INTO "fights" ("winner_punches", "looser_punches", "victory_type", "rounds", "winner_id", "looser_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?)  [["winner_punches", 1], ["looser_punches", 1], ["victory_type", 0], ["rounds", 1], ["winner_id", 18], ["looser_id", 2], ["created_at", "2018-10-15 15:46:13.479488"], ["updated_at", "2018-10-15 15:46:13.479488"]]

Я могуНе могу понять, возникла ли проблема из моего has_many / belongs_to объявления ассоциации или это проблема с БД.

Что сейчас работает:

  • figther.winned_fights
  • figther.loosed_fights

Кто-нибудь поведет меня по правильному пути?

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Вы всегда должны стараться придерживаться миграций для работы с модификациями БД.

вы можете добавить внешние ключи в соответствующие таблицы после того, как они были созданы, и он будет правильно индексировать их в Rails 4+

rails g migration addWinnerReferencesToFights winner_id:references
rails g migration addLooserReferencesToFights looser_id:references

PS - это также очень помогает, если вы пишетеправильные модели, т. е. английское слово, называемое выигрышным или проигранным, отсутствует >>> правильное множественное число - это выигрыши и проигрыши (проигрыш означает, что что-то не плотно или прикреплено)

0 голосов
/ 15 октября 2018

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

Теперь проблема на самом деле в базе данных, когда вынаписав или сгенерировав миграцию для построения модели, вы, вероятно, использовали поле own_to (или поле ссылок), которое автоматически создает ограничение внешнего ключа для базы данных.

Итак, у вас есть ограничение внешнего ключа из столбца looser_idк таблице (автоматически угадал) неудачники.Вы должны проверить свой schema.rb, чтобы убедиться, что это правильно, и в этом случае просто удалите это ограничение или исправьте его с помощью другой миграции: иностранец - удалить внешний ключ

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