Сохранить идентификатор объекта, который я создаю, во внешнем ключе другого объекта - PullRequest
0 голосов
/ 12 июня 2019

У меня есть две модели: Activity и LocationActivity.

Activity может иметь тип места, это место может быть room или location, и эту информацию я храню в своей таблице location_activities с внешним ключом activity_id.

Мне нужно, чтобы при создании activity и выборе типа места я мог сохранить идентификатор activity в activity_id моего стола location_activities

def create
    @activity = Activity.new(activity_params)

    if params[:activity][:type_place_activity] == RoomEvent.name
        room_event = RoomEvent.find(params[:activity][:room_event][:id])
        location_activity = LocationActivity.new
        location_activity.activity_place = room_event
    end

      location_activity.activity_id = @activity

    if @activity.save
      render json: {status: 'created', message: 'Activity save'}
    else
      render json: @activity.errors, status: :unprocessable_entity
    end
  end

У меня есть этот код, но запись location_activities не сохраняется в моей базе данных

Как я могу решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Хотя ответ Василисы решит проблему, я не думаю, что логика принадлежит контроллеру. Я бы изменил ActivityController следующим образом:

def create
  @activity = Activity.new(activity_params)
  if @activity.save_with_location_activities(params[:activity][:room_event][:id])
    render json: { status: 'created', message: 'Activity save' }
  else
    render json: @activity.errors, status: :unprocessable_entity
  end
end

А затем добавьте метод save_with_location_activities к модели Activity следующим образом:

class Activity
  def save_with_location_activities(room_event_id)
    room_event = RoomEvent.find(room_event_id)
    if room_event && self.valid?
      save
      LocationActivity.create(activity: self, activity_place: room_event)
    else
      return false
    end
  end
end
0 голосов
/ 12 июня 2019

Он не сохраняется, потому что вы только инициализируете его, но никогда не сохраняете. Также вы пытаетесь передать @activtity.id в качестве внешнего ключа перед его сохранением, в этот момент @activity не имеет идентификатора. Должно быть:

def create
  @activity = Activity.new(activity_params)

  if @activity.save
    add_location(@activity)
    render json: {status: 'created', message: 'Activity save'}
  else
    render json: @activity.errors, status: :unprocessable_entity
  end
end

private

def add_location(activity)
  return if params[:activity][:type_place_activity] != RoomEvent.name

  room_event = RoomEvent.find(params[:activity][:room_event][:id])
  activity.location_activities.create(activity_place: room_event)
end
...