问题描述
在rails中,我常用的一种模式是创建一个新的非持久对象,以使用默认值填充表单,例如
def createTable(self):
self.groupBox = qgroupbox("Tabela")
layout = qgridLayout()
self.main_model = pandasModel(dir_data)
self.view = QTableView()
self.view.setModel(self.main_model)
layout.addWidget(self.view)
self.groupBox.setLayout(layout)
def createEntities(self):
self.entities = qgroupbox("Entidades")
layout = QHBoxLayout()
for text in get_data.files:
btn = QPushButton(text)
btn.clicked.connect(lambda *args,table=text: self.change_model(table))
self.entities.setLayout(layout)
def change_model(self,table):
print(table)
self.main_model = pandasModel(good_data(table,directory))
self.view.setModel(self.main_model)
self.view.show()
我已经使用graphql ruby创建了一个表单,我想使用一个非持久对象填充默认值 即我有一个由contractParts填充的createOrUpdate表单
class ContactsController < ApplicationController
def new
@contact = Contact.new
end
end
...
<%= form_for(@contact) %>
并在我的query_types.rb
中query Contract($contractId: ID!) {
contract(id: $contractId) {
...contractParts
}
}
query DefaultContract($ownerId: ID!) {
defaultContract(ownerId: $ownerId) {
...contractParts
}
}
我想知道这种模式是否可以,或者是否因为我返回的对象没有ID而会有问题。 我浏览了所有文档,但找不到任何相关信息,这不是适当的graphql吗?
解决方法
当然可以做到这一点。您可以使用任何默认设置创建未保存对象的“集合”:
# 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,但是如果它们仍在为您工作,那么继续使用就没什么问题他们。