Опасно ли возвращать несуществующую activerrecord с ruby graphql?

#ruby-on-rails #ruby #graphql #graphql-ruby

#ruby-on-rails #ruby #graphql #graphql-ruby

Вопрос:

В rails распространенный шаблон, который я использовал, — создать новый unpersisted объект для заполнения форм значениями по умолчанию, например

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

Я создал форму, используя graphql ruby, и я хотел бы заполнить значения по умолчанию, используя unpersisted объект
, т.Е. У меня есть форма CreateOrUpdate, заполненная contractParts

 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
  

Мне интересно, подходит ли этот шаблон, или из-за того, что я возвращаю объект без идентификатора, возникнут проблемы.
Я просмотрел всю документацию и ничего не могу найти по этому поводу, разве это не правильный graphql?

Ответ №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, в зависимости от вашей схемы, вероятно, можно было бы достичь границы вашего агрегата, поэтому вам нужно быть осторожным с этим. Что касается вашего другого вопроса, нет ничего плохого в использовании несохраненного объекта или объекта без идентификатора. Будьте осторожны с ассоциациями, которые автоматически сохраняются при назначении, поскольку это может привести к довольно захватывающим и неожиданным результатам.

Лично я считаю, что не требуется много сложностей, чтобы перерасти генераторы форм rails, и я предпочитаю создавать сложные пользовательские интерфейсы на интерфейсе, но если они все еще работают на вас, нет ничего плохого в том, чтобы продолжать их использовать.