【问题标题】:error with polymorphism and jsonapi-resources多态性和 jsonapi-resources 错误
【发布时间】:2021-02-19 08:03:27
【问题描述】:

我正在尝试使用 Rails 5 中的 jsonapi-resources 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字段表示与inspectorsbuyers的多态关联。这一切都在我们当前的 Rails 设置中按预期工作,但在尝试使用 jsonapi-resources 为 JSON:API 设置它时遇到错误。

现在对应的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-rails json-api jsonapi-resources


    【解决方案1】:

    核心问题其实和 jsonapi-resources 无关,是关联。 belongs_to 资源的反面始终是 has_onehas_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 中工作,因为当您关联两个模型时,它只会在一侧写入外键。

    【讨论】:

    • 谢谢,@max!我会试试这个改变。也就是说,Rails 是否只是让我们侥幸拥有两个 belongs_to 关联,即使它在技术上是不正确的?
    • Rails 实际上不会在反面查看模型,直到您实际使用关联并获取记录。这确实是您在像 Ruby 这样的动态语言中所期望的,其中大多数事情都是在运行时解决的。
    • 刚刚尝试了建议的更改,但我仍然收到相同的错误
    • 文档有点模糊,但我认为您可能需要 relationship :profile, polymorphic: true 而不是 UserResource 中的 has_one :profile。我猜relationship 对应于belongs_tojsonapi-resources.com/v0.10/guide/resources.html#Relationships
    • 运气不好 :( 这是库中的违规代码:github.com/cerebris/jsonapi-resources/blob/v0.10.2/lib/jsonapi/…。注意到它只查看has_many,所以不确定这是否与它有关跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    相关资源
    最近更新 更多