Home > Blockchain >  Delete existing Records if they are not in sent array Rails 5 API
Delete existing Records if they are not in sent array Rails 5 API

Time:03-30

I need help on how to delete records that exist in the DB but not in array sent in a request;

My Array:

[
    {   "id": "509",
        "name": "Motions move great",
        "body": "",
        "subtopics": [
            {   
                "title": "Tywan",
                "url_path": "https://ugonline.s3.amazonaws.com/resources/6ca0fd64-8214-4788-8967-b650722ac97f/WhatsApp Audio 2021-09-24 at 13.57.34.mpeg"
            },
            {
                
                "title": "Transportations Gracious",
                "url_path": "https://ugonline.s3.amazonaws.com/resources/6ca0fd64-8214-4788-8967-b650722ac97f/WhatsApp Audio 2021-09-24 at 13.57.34.mpeg"
            },
            {
                "title": "Transportation part",
                "url_path": "https://ugonline.s3.amazonaws.com/resources/6ca0fd64-8214-4788-8967-b650722ac97f/WhatsApp Audio 2021-09-24 at 13.57.34.mpeg"
            }
        ]
    },
    {
        "name": "Motions kkk",
        "body": "",
        "subtopics": [
            {   
                "title": "Transportations",
                "url_path": "https://ugonline.s3.amazonaws.com/resources/6ca0fd64-8214-4788-8967-b650722ac97f/WhatsApp Audio 2021-09-24 at 13.57.34.mpeg"
            }
        ]
    }
]

Below is my implementation: where am going wrong?

@topics = @course.topics.map{|m| m.id()}
                     @delete= @topics
                    puts @delete
                  if Topic.where.not('id IN(?)', @topics).any?
                      @topics.each do |topic|
                        topic.destroy
                    end 
                  end 

CodePudding user response:

it's not clear to me where, in your code, you pick the ids sent in the array you showed before... so I'm assuming like this:

   objects_sent = [
    {   "id": "509",
        "name": "Motions move great",
        "body": "",
        "subtopics": [
            {   
                "title": "Tywan",
                "url_path": "https://ugonline.s3.amazonaws.com/resources/6ca0fd64-8214-4788-8967-b650722ac97f/WhatsApp Audio 2021-09-24 at 13.57.34.mpeg"
            },
            {
                
                "title": "Transportations Gracious",
                "url_path": "https://ugonline.s3.amazonaws.com/resources/6ca0fd64-8214-4788-8967-b650722ac97f/WhatsApp Audio 2021-09-24 at 13.57.34.mpeg"
            },
            {
                "title": "Transportation part",
                "url_path": "https://ugonline.s3.amazonaws.com/resources/6ca0fd64-8214-4788-8967-b650722ac97f/WhatsApp Audio 2021-09-24 at 13.57.34.mpeg"
            }
        ]
    },
    {
        "name": "Motions kkk",
        "body": "",
        "subtopics": [
            {   
                "title": "Transportations",
                "url_path": "https://ugonline.s3.amazonaws.com/resources/6ca0fd64-8214-4788-8967-b650722ac97f/WhatsApp Audio 2021-09-24 at 13.57.34.mpeg"
            }
        ]
    }
]

since you have your array like this, the only information you need to query on database is the ids (also, assuming the id's in the array are the id's on database, otherwise it wouldn't make sense). You can get them like this:

sent_ids = objects_sent.map{|o| o['id'].to_i}

Also, it seems to me that, for the code you showed, you want to destroy them based on a specific course. There would be 2 ways to do that. First, using the relationship (I prefer like this one):

@course.topics.where.not(id: sent_ids).destroy_all

Or you can do the query directly on the Topic model, but passing the course_id param:

Topic.where(course_id: @course.id).where.not(id: sent_ids).destroy_all

ActiveRecord is smart enough to mount that query correctly in both ways. Give it a test and see which works better for you

  • Related