我已经创建了一个数据库视图(basketball_players),它是一个常规表(watchlist_players)的父表:
class BasketballPlayer < ApplicationRecord
self.primary_key = :id
has_many :watchlist_players, foreign_key: 'player_id'
end
class WatchlistPlayer < ApplicationRecord
belongs_to :watchlist
belongs_to :basketball_player
enum status: [:prospect, :pending, :ignore]
end
当我尝试创建子记录时,我得到父记录不存在的错误。例如,从控制台:
bb_player = basketballplayer=比;# & lt; BasketballPlayer:…id: 202,姓名:Heather N yonn;…
watchlist = watchlist .first=比;# & lt;观察名单中:…Id: 260,域:1,…
watchlist_player = WatchlistPlayer。新(watchlist_id:观察名单中。Id, player_id: bb_player.id=比;# & lt; WatchlistPlayer:…Id: nil, watchlist_id: 260, player_id: 202,…)
watchlist_player.save=比;假
watchlist_player.errors.full_messages=比;["篮球运动员必须存在"]
有人明白发生了什么吗?
谢谢!
你看到错误" Basketball player must exists ";因为默认情况下需要belongto关联(从rails 5开始),而且没有找到Basketball Player对象。
所以,一个"fix"解决问题的方法是让篮球运动员协会成为可选的,或者确保篮球运动员的存在。可以使用以下命令将关联设置为可选的:
belongs_to :basketball_player, optional: true
要在watchlist_player上设置篮球运动员,需要为belongs_to
协会使用的外键分配ID。默认情况下,名为basketball_player
的关联将查看basketball_player_id
字段。您正在设置player_id
字段。如果您希望player_id
填充basketball_player
关联,那么像这样定义使用该外键的关联:
belongs_to :basketball_player, foreign_key: :player_id
或者将basketball_player_id
设置为该视图中行的有效id。
它也可以帮助你理解你在这里想要完成什么。根据我的经验,最好的做法是尽可能将关联设置为数据库外键,这样就可以使用数据库引用完整性。您不能为视图设置数据库外键,只能为基础表设置数据库外键,因此我通常建议将引用完整性关联设置为基础表而不是视图本身。