我有两个模型,它们通过与外键的两个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
有人会引导我走正确的路吗?
答案 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或松散>>>正确的复数形式是赢与输(松散是指没有紧紧或粘贴的东西)