【问题标题】:Is it dangerous to return an unpersisted activerrecord with ruby graphql?使用 ruby​​ graphql 返回未持久化的 activerrecord 是否危险?
【发布时间】:2020-10-05 20:18:24
【问题描述】:

在 Rails 中,我使用的一个常见模式是创建一个新的非持久对象以使用默认值填充表单,例如

class ContactsController < ApplicationController
  def new
    @contact = Contact.new
  end
end
...
<%= form_for(@contact) %>

我使用 graphql ruby​​ 创建了一个表单,我想使用非持久对象填充默认值 即我有一个由contractParts 填充的createOrUpdate 表单

query Contract($contractId: ID!) {
  contract(id: $contractId) {
    ...contractParts
  }
}
query DefaultContract($ownerId: ID!) {
  defaultContract(ownerId: $ownerId) {
    ...contractParts
  }
}

在我的 query_types.rb 中

  def default_contract(owner_id:)
    owner = Owner.find(owner_id)
    Contract.new(owner: owner)
  end

我想知道这种模式是否可以,或者是否因为我返回一个没有 ID 的对象会出现问题。 我浏览了所有文档,但找不到任何关于此的内容,这不是正确的 graphql 吗?

【问题讨论】:

    标签: ruby-on-rails ruby graphql graphql-ruby


    【解决方案1】:

    当然可以。您可以使用您喜欢的任何默认值创建未保存对象的“聚合”:

     # app/models/default_contract_aggregate.rb
     class DefaultContractAggregate < Contract
       def initialize
         self.rel1 = DefaultRel1.new
         # etc
       end
     end
    
     # app/graphql/types/query_type.rb
     def default_contract(owner_id:)
       owner = Owner.find(owner_id)
       DefaultContractAggregate.new(owner: owner)
     end
    

    这不是最糟糕的想法,但当然,对于 graphql,根据您的架构,它可能会到达聚合的边界,因此您必须小心。至于您的另一个问题,使用未保存的对象或使用没有 ID 的对象本身并没有错。请谨慎使用自动保存分配的关联,因为这会导致非常令人兴奋和意想不到的结果。

    就个人而言,我发现超越 Rails 表单生成器并不需要太多复杂性,我更喜欢在前端构建复杂的 UI,但如果它们仍然为您工作,那么继续使用没有什么问题他们。

    【讨论】:

      猜你喜欢
      • 2019-07-09
      • 2021-02-04
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 2010-11-30
      • 1970-01-01
      • 2017-08-21
      相关资源
      最近更新 更多