Rails按特定字段名称嵌套属性

时间:2016-04-25 18:12:31

标签: ruby-on-rails

我获得了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

我想要的是与事件记录的子项相同的功能。因此,如果它们已经在事件上,它将更新它们而不仅仅是插入新行。

1 个答案:

答案 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),而不是创建新记录。