[Ruby on Rails] 다른 테이블을 참조하여 id를 검색하고 외래 키로 데이터 삽입

4088 단어 루비RailsRails5

실현하고 싶은 일



데이터를 삽입하는 테이블과는 다른 테이블의 정보를 참조해, 해당하는 데이터의 id를 외래 키로서 원의 테이블에 데이터를 추가한다


전제



테이블에는 생산량 데이터가 있는 Productions(생산량) 테이블과 제품 정보가 있는 Items(제품) 테이블이 있습니다. Productions 모델에는 id와 amount(생산량), Items 테이블과 연결하기 위한 Item_id가 있습니다. Items 테이블에는 id와 code(제품 코드)와 name(제품명)의 열이 있습니다. 또한 Goods 테이블에는 이미 제품 정보가 들어 있다고 가정합니다.

지금 시도하고있는 일



Productions 컨트롤러의 create 작업에서 Prodections 테이블에 생산량과 제품 정보를 추가합니다.
폼에서는 amount(생산량)와 Items 테이블의 code의 값을 입력하는 형태로 되어 있습니다(폼에서는 name을 Item_id로 하고 있습니다).
이때 amount(생산량)는 그대로 Productions 모델에 추가할 수 있지만 item_id는 외래 ​​키이므로 당연히 그대로 입력할 수 없습니다. 따라서 입력된 값에서 Items 모델의 코드 정보를 참조하여 Items의 id를 Productions의 item_id에 추가합니다.

방법



우선 양식은 쉽게 이렇게 되어 있습니다.

index.html
<%= form_for [@production], url: productions_path do |f| %>
  <%= f.text_field :amount %>
  <%= f.text_field :good_id  %>
  <%= f.submit '追加' %>
<% end %>

그리고 컨트롤러의 create 액션을 다음과 같이 씁니다.

controller/productions_controller.rb
class ProductionsController < ApplicationController
  def create
    item_id = Item.find_by(code: params[:production][:item_id]).id
    Production.create(production_params.merge(item_id: item_id))
  end

  private
  def production_params
    params.require(:production).permit(:amount)
  end
end

permit에서는 amount 만 허용하고 create 액션 내에서 find_by를 사용하여 item_id = Item.find_by(code: params[:production][:item_id]).id로 작성하고 Item 테이블에서 데이터를 찾습니다. , item_id에 다시 넣습니다.
그리고 create 액션을 할 때, item_id를 merge하는 것으로 외래 키로서 id의 값을 삽입할 수 있었습니다.

주의점



폼에서 form_for를 사용하고 있으므로, 값을 건네줄 때는 params[:production][:item_id]라고 써 봅시다. params[:item_id] 라고 쓰면 값이 전달되지 않고 오류가 발생합니다.

보충 정보



Rails 5.0.7.2
루비 2.5.1

좋은 웹페이지 즐겨찾기