0

What is a good syntaxic manner to handle the following array structure and create database records in rails, according to an instance variable?

It is quite obvious that such a structure becomes unwieldly very quickly...

if @event.persons_per_unit == "2"
  if @event.number_units == "1"
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][0]['persons'][0]['type'], 
      first_name: @r['items'][0]['units'][0]['persons'][0]['first_name'], 
      surname: @r['items'][0]['units'][0]['persons'][0]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][0]['persons'][1]['type'], 
      first_name: @r['items'][0]['units'][0]['persons'][1]['first_name'], 
      surname: @r['items'][0]['units'][0]['persons'][1]['surname'])
  elsif @event.number_units == "2"
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][0]['persons'][0]['type'], 
      first_name: @r['items'][0]['units'][0]['persons'][0]['first_name'], 
      surname: @r['items'][0]['units'][0]['persons'][0]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][0]['persons'][1]['type'], 
      first_name: @r['items'][0]['units'][0]['persons'][1]['first_name'], 
      surname: @r['items'][0]['units'][0]['persons'][1]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][1]['persons'][0]['type'], 
      first_name: @r['items'][0]['units'][1]['persons'][0]['first_name'], 
      surname: @r['items'][0]['units'][1]['persons'][0]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][1]['persons'][1]['type'], 
      first_name: @r['items'][0]['units'][1]['persons'][1]['first_name'], 
      surname: @r['items'][0]['units'][1]['persons'][1]['surname'])
  elsif @event.number_units == "3"
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][0]['persons'][0]['type'], 
      first_name: @r['items'][0]['units'][0]['persons'][0]['first_name'], 
      surname: @r['items'][0]['units'][0]['persons'][0]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][0]['persons'][1]['type'], 
      first_name: @r['items'][0]['units'][0]['persons'][1]['first_name'], 
      surname: @r['items'][0]['units'][0]['persons'][1]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][1]['persons'][0]['type'], 
      first_name: @r['items'][0]['units'][1]['persons'][0]['first_name'], 
      surname: @r['items'][0]['units'][1]['persons'][0]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][1]['persons'][1]['type'], 
      first_name: @r['items'][0]['units'][1]['persons'][1]['first_name'], 
      surname: @r['items'][0]['units'][1]['persons'][1]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][2]['persons'][0]['type'], 
      first_name: @r['items'][0]['units'][2]['persons'][0]['first_name'], 
      surname: @r['items'][0]['units'][2]['persons'][0]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][2]['persons'][1]['type'], 
      first_name: @r['items'][0]['units'][2]['persons'][1]['first_name'], 
      surname: @r['items'][0]['units'][2]['persons'][1]['surname'])
  elsif @event.number_units == "4"
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][0]['persons'][0]['type'], 
      first_name: @r['items'][0]['units'][0]['persons'][0]['first_name'], 
      surname: @r['items'][0]['units'][0]['persons'][0]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][0]['persons'][1]['type'], 
      first_name: @r['items'][0]['units'][0]['persons'][1]['first_name'], 
      surname: @r['items'][0]['units'][0]['persons'][1]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][1]['persons'][0]['type'], 
      first_name: @r['items'][0]['units'][1]['persons'][0]['first_name'], 
      surname: @r['items'][0]['units'][1]['persons'][0]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][1]['persons'][1]['type'], 
      first_name: @r['items'][0]['units'][1]['persons'][1]['first_name'], 
      surname: @r['items'][0]['units'][1]['persons'][1]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][2]['persons'][0]['type'], 
      first_name: @r['items'][0]['units'][2]['persons'][0]['first_name'], 
      surname: @r['items'][0]['units'][2]['persons'][0]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][2]['persons'][1]['type'], 
      first_name: @r['items'][0]['units'][2]['persons'][1]['first_name'], 
      surname: @r['items'][0]['units'][2]['persons'][1]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][3]['persons'][0]['type'], 
      first_name: @r['items'][0]['units'][3]['persons'][0]['first_name'], 
      surname: @r['items'][0]['units'][3]['persons'][0]['surname'])
    @entiti = Entiti.create(event_id: @event.id,
      type: @r['items'][0]['units'][3]['persons'][1]['type'], 
      first_name: @r['items'][0]['units'][3]['persons'][1]['first_name'], 
      surname: @r['items'][0]['units'][3]['persons'][1]['surname'])
  else
1
  • What does @r look like? That wall of code is a little noisy, might be easier to start with the data. Also, where does the data come from and can you change that to be more convenient? Commented Aug 9, 2018 at 22:31

1 Answer 1

1

It looks like (unless I'm misreading things) you probably just want a couple of loops. Something along the lines of:

@r['items'].each do |item|
  item['units'].each do |unit|
    unit['persons'].each do |person|
      # if `slice` is available, otherwise just create the hash as you've done
      # using `person` instead of the long nested chain
      Entiti.create(person.slice('type', 'first_name', 'surname').
        merge(event_id: @event.id))
    end
  end
end

if you're worried about things like @event.persons_per_unit == 2 and then having 3 person records in a unit hash, you could use take:

unit['persons'].take(@event.persons_per_unit.to_i).each do |person|
  # ...
end

Same for number of units, if there's a maximum number of units allowed (say, you can't have more than 4, but you are worried you might have 5 in @r['items']. If these are concerns for you, I'd recommend tying an Entiti to the Event (via a has_many) and setting up model validations to make sure things are in line. If the Event model has a has_many already, you could also just @event.entitis.create(...) (not sure how that'll pluralize)

Also, you keep reassigning @entiti, and only the last one will stick, you might want an array if you need all instances later, otherwise no need to store it at all.

Sign up to request clarification or add additional context in comments.

1 Comment

slice turned out to be unavailable. Great pointer on controlling the creation limited to instance variable values

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.