在Rails中为数据库视图创建子记录的问题



我已经创建了一个数据库视图(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。

它也可以帮助你理解你在这里想要完成什么。根据我的经验,最好的做法是尽可能将关联设置为数据库外键,这样就可以使用数据库引用完整性。您不能为视图设置数据库外键,只能为基础表设置数据库外键,因此我通常建议将引用完整性关联设置为基础表而不是视图本身。

最新更新