我获得了JSON帖子以使用嵌套属性。我无法使用子模型发布JSON记录,并且发布的信息很好。
然而,当我更新记录时,我搜索名为“tracking_id”的字段,因为上传程序不知道模型的rails id。它是单向上传并且仍然不可知。使用此字段,我可以找到正确的记录并发布更新。然而,插入的孩子而不是更新。
有没有办法告诉它根据我定义的字段找到子项,而不仅仅是“id”,因为客户端应用程序不知道那是什么?
示例:
#in Event Model
def self.batch_create(post_content, keymaster)
#keymaster is the user so we can add events to the right place
# begin exception handling
begin
# begin a transaction on the event model
Event.transaction do
# for each event record in the passed json
JSON.parse(post_content).each do |event_hash|
# create a new event
# if hash has tracking_id use that
if event_hash["tracking_id"].present?
event = keymaster.events.where(tracking_id: event_hash["tracking_id"]).first_or_initialize
else
event = keymaster.events.new
end
if event
# update the existing event record
event.update!(event_hash)
end # event.count
end # json.parse
end # transaction
rescue Exception => e
Rails.logger.info("Did not create batch events")
Rails.logger.info("caught exception #{e}! ohnoes!")
# Rails.logger.info(post_content)
end # exception handling
end # batch_create
我想要的是与事件记录的子项相同的功能。因此,如果它们已经在事件上,它将更新它们而不仅仅是插入新行。
答案 0 :(得分:1)
一种可能性是遍历嵌套的params并注入Rails用来检查现有nested_attribute的id
字段:
不确定你的params是如何构造的,但这里是伪代码:
For each event hash in `events_attributes` nested attributes:
Find event by whatever attributes you've defined in your hash
Inject `id` of found event into the attributes hash
现在您的嵌套中有id
字段,Rails将更新现有记录(即upsert),而不是创建新记录。