如何将参数传递到Rails中的两个不同表

时间:2019-05-18 19:57:25

标签: ruby-on-rails ruby-on-rails-3

作为一个新手,我开始进行API POC。我有一种情况,如下所述:

我有seekerController,它具有create方法。我希望当Post请求发出请求时,很少有参数需要进入seeker表,而很少有需要进入profile表(该表还具有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 :(得分:0)

使用给出的有限信息,似乎问题可能与seeker_id的结果中seekerprofile_params字段为空有关。基本上,我们在保存params[:seeker_id]之后将params[:seeker_id] = seeker[:id]设置为Seeker。但是在创建用于创建SeekerProfile的参数时,我们使用seekerprofile_paramsseeker_id中查找params[:seeker_profile][:seeker_id],因为在允许params.require(:seeker_profile)之前使用seeker_id。由于SeekerProfile未获得seeker_id,因此可能无法保存,具体取决于模型的设置方式。
但是,如果您要同时创建SeekerSeekerProfile两者,则可能要签出nested attributes in Rails

在收到更多输入后进行编辑:

考虑到API合同不能更改且需要维护,可以使用以下方法来创建seekerseeker_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块不是必需的,因为任何正在创建的对象的失败都会使整个事务回滚。