如何使用相同的数据更新不同表上的三个相似字段?

问题描述 投票:0回答:2

我有两个模型Commuter和RideLaterRequest

RideLaterRequest表如下所示。

create_table "ride_later_requests", force: :cascade do |t|
   t.string   "customer_name"
   t.string   "phone_number"
   t.string   "email"
end

这些列是从视图文件创建的,其中用户输入这些详细信息并由控制器操作创建。

def complete_booking_request
   #create a record of name, phone_number,email on RideLaterRequest
end

视图

<%= bootstrap_form_for @ride_later_request ,url: bookings_complete_booking_request_path, id: "get_otp_form", method: :post, remote:true do |f| %>

      <%= f.text_field :customer_name, hide_label:true, placeholder: 'Name', class:'form-control'%>
      <%= f.email_field :email,hide_label:true, placeholder: 'Email', class:'form-control' %>
      <%= f.telephone_field :phone_number, hide_label:true, placeholder: 'Mobile', class:'form-control'%>
<%end%>

现在我有另一个类似领域的模型Commuter。

 create_table "commuters", force: :cascade do |t|
         t.string   "phone_number"
         t.string   "first_name"
         t.string   "email"
  end

目前,没有选项可以从模板创建通勤数据。两个表中的字段都应该携带相同的数据。好像早期的开发人员只是生成了表并离开了。如何在创建时将RideLaterRequest中的电话,电子邮件,名称更新为Commuter表?

ruby-on-rails ruby
2个回答
2
投票

您可以使用after_save回调在RideLaterRequest模型中保存这些Commuter数据

    after_save { |ride_later_request_data|
      Commuter.create(
        phone_number: ride_later_request_data.phone_number,
        first_name: ride_later_request_data.customer_name,
        email: ride_later_request_data.email
      )
   }

或者您可以创建这样的方法

    after_save :save_commuter_data

    private

    def save_commuter_data
      Commuter.create( 
        phone_number: self.phone_number, 
        first_name: self.customer_name, 
        email: self.email 
      )
   end

1
投票

你可以像Active Record Callbacks / after_save一样使用after_create

在模型RideLaterRequest中,

after_save :copy_data_to_commuter

private

def copy_data_to_commuter Commuter.create( phone_number: self.phone_number, first_name: self.customer_name, email: self.email ) end

这里self.phone_number给出了正在保存的RideLaterRequest类的对象的值。您也可以直接使用phone_number而不是self.phone_number

© www.soinside.com 2019 - 2024. All rights reserved.