两个模型之间有多个belongs_to has_many:SQLException:没有这样的表

时间:2018-10-15 16:07:11

标签: sql ruby-on-rails ruby sqlite

我有两个模型,它们通过与外键的两个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'

db / schema.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 :(得分:1)

第一件事,我认为您不需要在战斗模型中放置Foreign_key选项,因为它通常是从关联名称中获取的。

现在,问题出在数据库中,当您编写或生成迁移以构建模型时,您可能使用了一个belongs_to字段(或引用字段),该字段会自动在数据库上创建外键约束。

因此,从列lacker_id到表(自动猜测)的松散器,您具有外键约束。您应该检查您的schema.rb以查看是否正确,在这种情况下,只需删除该约束或使用另一个迁移即可解决该约束: foreigner - remove foreign key

答案 1 :(得分:0)

您应该始终尝试迁移以进行数据库修改。

您可以在创建外键后将其添加到各个表中,它将在Rails 4+中正确索引它

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

PS-如果正确拼写模型,这也将大有帮助,例如:没有英文单词被称为winned或松散>>>正确的复数形式是赢与输(松散是指没有紧紧或粘贴的东西)