Как передать параметры в две разные таблицы в рельсах - PullRequest
0 голосов
/ 18 мая 2019

Как новичок я начал заниматься API POC. У меня есть ситуация, как объяснено ниже:

У меня есть seekerController, в котором есть метод create. Я хочу, чтобы при выполнении запроса Post несколько параметров приходилось на таблицу поиска, а немногие - на таблицу профиля (в этой таблице также есть столбец seekerID). Я хочу сделать это с помощью фиксации транзакции. Итак, после прочтения я начал делать ниже: -

ActiveRecord::Base.transaction do
          seeker = Seeker.new(seeker_params)
          seeker.save!
          params[:seeker_id] = seeker[:id]

          seekerprofile = SeekerProfile.new(seekerprofile_params)
          seekerprofile.save!
          end
      render json: {status: 'success', message: 'Request is processed successully', data:seeker},status: :created;

У меня есть определение ниже: (Я сомневаюсь, что приведенный ниже способ верен)

def seeker_params
    params.require(:seeker).permit(:username, :alias, :mobile_number, :country_code, :email_address, :description, :status)
  end
  def seekerprofile_params
    params.require(:seeker_profile).permit(:seeker_id, :first_name, :middle_name, :last_name, :date_of_birth, :pincode, :building_name, :address, :email_address, :description, :status)

  end

Позвольте мне задать свой вопрос прямо здесь: - У меня есть параметр запроса тела сообщения, как показано ниже:

{
      "username" : "TestName12",
      "alias" :  "TestAlia12",
     #above should go to seeker table
      "first_name":"xyz",
      "Last_Name":"abc"
      #above should go above Seekerprofile table. seekerprofile has seekerid also.
} 

Моя модель ниже: -

> class SeekerProfile < ApplicationRecord
> 
>   belongs_to :seeker end

Я пробовал то, что я написал в стартовом коде, но я получаю сообщение об ошибке, так как seekerprofile_params пусто. Поэтому я уверен, что мой подход неверен.

Может ли кто-нибудь предоставить пример кода, как это сделать? Я парень из java, поэтому свежее для ruby.

1 Ответ

0 голосов
/ 19 мая 2019

При наличии ограниченной информации кажется, что проблема может быть связана с тем, что поле seeker_id было пустым в результате seekerprofile_params.По сути, мы устанавливаем params[:seeker_id] как params[:seeker_id] = seeker[:id] после сохранения Seeker.Но при создании параметров для создания SeekerProfile мы используем seekerprofile_params, который ищет seeker_id в params[:seeker_profile][:seeker_id], поскольку мы используем params.require(:seeker_profile) перед разрешением seeker_id.Поскольку SeekerProfile не получает seeker_id, оно может не сохраняться в зависимости от того, как настроена модель.
Однако, если вы пытаетесь создать как Seeker, так и SeekerProfile, вы можете проверить вложенных атрибутов в Rails .

Отредактируйте после получения дополнительных входных данных:

Учитывая, что контракт API не может быть изменен и его необходимо поддерживать, можно использовать следующий подход для создания seeker и seeker_profile:
1) Мы могли быизмените модель Seeker, чтобы принимать вложенные атрибуты для SeekerProfile следующим образом:

# app/models/seeker.rb

has_many :seeker_profiles  # As mentioned in the question comments
accepts_nested_attributes_for :seeker_profiles

2) Затем можно изменить код контроллера следующим образом:

# app/controllers/seeker_controller.rb

def create
  seeker = Seeker.new(creation_params)
  seeker.save!

  render json: {status: 'success', message: 'Request is processed successully', data:seeker},status: :created
end

private

def creation_params
  params.permit(:username, :alias).merge(seeker_profiles_attributes: [seeker_profile_creation_params])
end

def seeker_profile_creation_params
  params.permit(:first_name, :last_name)
end

Что здесь происходитв основном мы разрешаем модели seeker принимать атрибуты для seeker_profiles во время создания.Эти атрибуты принимаются моделью с использованием средства записи атрибутов seeker_profiles_attributes.Поскольку это отношение has_many, seeker_profiles_attributes принимает массив объектов, где каждый хеш-объект представляет собой один seeker_profile дочерний элемент, который нужно создать.
В коде, упомянутом выше, я предположил, что только один seeker_profile должно быть создано.Если ваш API-интерфейс изменится и вы захотите принять несколько профилей во время создания, я бы оставил это на ваше усмотрение, с уверенностью, что вы сможете вернуться в комментарии в случае, если вы застряли.
Следует также отметить, что блок ActiveRecord::Base.transaction не требуется, поскольку сбой любого из создаваемых объектов в любом случае приведет к откату всей транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...