ruby-on-rails - 多态性和 jsonapi-resources 错误
问题描述
我正在尝试使用jsonapi-resources
Rails 5 中的 gem 设置多态关联。
我有一个User
模型,它有一个名为 的多态关联profile
,它的类型可以是Inspector
或Buyer
。以下是截断的模型:
class User < ApplicationRecord
belongs_to :profile, polymorphic: true
end
class Inspector < ApplicationRecord
belongs_to :user
end
class Buyer < ApplicationRecord
belongs_to :user
end
在users
表中,有对应的profile_id
和profile_type
字段来表示与 和 的多态inspectors
关联buyers
。这一切都在我们当前的 Rails 设置中按预期工作,但是当我尝试使用jsonapi-resources
.
现在对应的jsonapi-resources
资源和控制器(根据指示):
class Api::V1::Mobile::UserResource < JSONAPI::Resource
immutable
attributes :name, :email
has_one :profile, polymorphic: true
end
class Api::V1::Mobile::ProfileResource < JSONAPI::Resource
end
class Api::V1::Mobile::ProfilesController < Api::V1::Mobile::BaseController
end
据我所知,现在应该正确设置所有内容,但是在到达端点时出现以下错误:
"exception": "undefined method `collect' for nil:NilClass",
"backtrace": [
".rvm/gems/ruby-2.6.5/gems/jsonapi-resources-0.10.2/lib/jsonapi/relationship.rb:77:in `resource_types'",
当深入relationship.rb
研究堆栈跟踪中提到的内容时,它看起来无法解析多态类型,所以我尝试了以下方法:
class Api::V1::Mobile::UserResource < JSONAPI::Resource
immutable
attributes :name, :email
has_one :profile, polymorphic: true, polymorphic_types: ['inspector', 'buyer']
end
但是,唉,另一个错误:Can't join 'User' to association named 'inspector'; perhaps you misspelled it?
在此先感谢您提供有关此设置的任何帮助!
解决方案
核心问题实际上与 jsonapi-resources 无关,而是关联。资源的反面belongs_to
总是 a has_one
orhas_many
指向另一个表上的外键(反之亦然)。
class User < ApplicationRecord
belongs_to :profile, polymorphic: true
end
class Inspector < ApplicationRecord
has_one :user, as: :profile
end
class Buyer < ApplicationRecord
has_one :user, as: :profile
end
拥有两个belongs_to
相互指向的关联意味着您将在双方都有外键 - 由于重复,这是糟糕的数据库设计(应该只有一个事实来源)并且不会在 ActiveRecord 中真正工作,因为它会当您关联两个模型时,只在一侧写外键。
推荐阅读
- java - 通过 Google Maps API 获取当前位置
- sql - 在查询中插入替换函数
- javascript - 是否所有打算被其他类使用的 TypeScript 类都需要显式导出和导入?
- c# - 如何解决调用 Amazon SP-API 的问题,该 API 始终返回未经授权,即使使用有效的令牌和签名也是如此
- odata - Microsoft.OData.ODataException - URI 中指定的查询无效。在类型上找不到名为“标签”的属性
- flutter - Flutter Riverpod 小部件调用了两次
- flutter - 如何设置 BottomNavigationBarItem 标签的样式
- reactjs - 如何配置 k8s 入口以使用 react-router-dom
- android - 我可以在不使用 xml 文件的情况下在列表视图中添加视图吗
- spring-boot - 如何在 Kotlin Gradle 多模块项目中为 Spring Boot 应用程序配置“mainClassName”?