首页 > 解决方案 > 多态性和 jsonapi-resources 错误

问题描述

我正在尝试使用jsonapi-resourcesRails 5 中的 gem 设置多态关联。

我有一个User模型,它有一个名为 的多态关联profile,它的类型可以是InspectorBuyer。以下是截断的模型:

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_idprofile_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?

在此先感谢您提供有关此设置的任何帮助!

标签: ruby-on-railsjson-apijsonapi-resources

解决方案


核心问题实际上与 jsonapi-resources 无关,而是关联。资源的反面belongs_to总是 a has_oneorhas_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 中真正工作,因为它会当您关联两个模型时,只在一侧写外键。


推荐阅读