调用Reservation.last.card触发NoMethodError,求助排查问题
解决NoMethodError: undefined method `card' for Reservation实例的问题
嘿,这问题其实挺常见的,就是关联关系的定义搞反啦!让我给你理清楚:
问题根源
你在Reservation模型里写了has_one :card,但从你的数据库表结构和迁移文件来看,reservations表是带着card_id外键的——这意味着一个Reservation是属于某一个Card的,而不是Reservation拥有一个Card。
has_one关联的逻辑是:另一个模型的表中会有指向当前模型的外键(比如如果是Reservation has_one Card,那cards表应该有reservation_id),但你的情况刚好反过来,所以关联定义错了,自然调用card方法时会报错。
修正方法
只需要修改Reservation模型的关联代码:
class Reservation < ApplicationRecord # 把has_one :card改成belongs_to :card belongs_to :card belongs_to :park end
Card模型的关联是完全正确的,不用改动:
class Card < ApplicationRecord belongs_to :park has_many :reservations end
为什么这样改?
belongs_to :card:表示Reservation实例属于一个Card,对应外键card_id在reservations表中,完全匹配你的数据库结构。Card的has_many :reservations:表示一个Card可以对应多个Reservation,和你当前的表结构也完全匹配。
改完之后再调用Reservation.last.card,应该就能正常获取关联的Card实例啦!
附:你遇到的错误信息
Reservation Load (0.3ms) SELECT "reservations".* FROM "reservations" ORDER BY "reservations"."id" DESC LIMIT $1 [["LIMIT", 1]] NoMethodError: undefined method `card' for #<Reservation:0x090d440e130> Did you mean? card_id
内容的提问来源于stack exchange,提问作者techquestion
相关产品推荐
相关产品推荐

