質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

2342閲覧

rails で、銀行、支店の関係を持ったマスタデータを作成する画面を作りたい

ak_suzuki

総合スコア194

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2017/06/22 04:53

編集2017/06/22 08:14

###前提・実現したいこと
銀行(bank)とその支店(branch)を登録するための画面を作ろうとしています。
bankとbranchをscaffoldで以下のようなモデルで作りました。
Banks
string :bank_cd, limit: 4
string :bank_name

Branches
string :bank_cd, limit: 4
string :branch_cd, limit: 4
string :branch_name

また、
bank.rb

class Bank < ApplicationRecord has_many :branches, dependent: :destroy end

branch.rb

class Branch < ApplicationRecord belongs_to :bank end

という状態です。

ここで、view/branches/_form.html.erb 内のbank_cdを入れる部分を以下のようにしました。

<div class="field"> <%= form_for @branch do |f| %> <%= f.label :bank_cd %> <%= f.collection_select :bank_cd, Bank.all, :bank_cd, :bank_name %> <% end %> </div>

画面上は想定通りに出てくるのですが、支店レコードを保存することができません。

なお、コントローラーは下記のようにscaffoldのほぼデフォルトです。

branches_controller.rb

class

1 before_action :set_branch, only: [:show, :edit, :update, :destroy] 2 3 def index 4 @branches = Branch.all 5 end 6 7 def show 8 end 9 10 def new 11 @branch = Branch.new 12 end 13 14 def edit 15 end 16 17 def create 18 @branch = Branch.new(branch_params) 19 20 respond_to do |format| 21 if @branch.save 22 format.html { redirect_to @branch, notice: 'Branch was successfully created.' } 23 format.json { render :show, status: :created, location: @branch } 24 else 25 format.html { render :new } 26 format.json { render json: @branch.errors, status: :unprocessable_entity } 27 end 28 end 29 end 30 31 def update 32 respond_to do |format| 33 if @branch.update(branch_params) 34 format.html { redirect_to @branch, notice: 'Branch was successfully updated.' } 35 format.json { render :show, status: :ok, location: @branch } 36 else 37 format.html { render :edit } 38 format.json { render json: @branch.errors, status: :unprocessable_entity } 39 end 40 end 41 end 42 43 def destroy 44 @branch.destroy 45 respond_to do |format| 46 format.html { redirect_to branches_url, notice: 'Branch was successfully destroyed.' } 47 format.json { head :no_content } 48 end 49 end 50 51 private 52 def set_branch 53 @branch = Branch.find(params[:id]) 54 end 55 56 def branch_params 57 params.require(:branch).permit(:bank_cd, :branch_cd, :branch_name) 58 end 59end 60

どなたか、お力添え願えますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mbk

2017/06/22 06:50

保存する部分のcontrollerのコードも貼って頂けますか。
ak_suzuki

2017/06/22 08:14

ありがとうございます。元の質問に、branches_controller.rb のコードを付け加えました。よろしくお願いいたします。
guest

回答1

0

ベストアンサー

モデルの立て方が間違っているのでは?
Rails(レールズ)は読んで字のごとくレールに乗ることを前提とします。

ruby

1class Bank < ApplicationRecord 2 has_many :branches, dependent: :destroy 3end

例えばこれ
has_many :branches

has_many :branches, primary_key: :id,foriegn_key: :bank_id
を省略(Rails規約に従っていれば書かなくていい)したものです。
Railsでアプリを書くならbrancheはbank_idを持っているのが、前提!!
あえて、レールから外れ、bank_cd(String)で親子関係を定義するには
has_many :branches, primary_key: :bank_cd,foriegn_key: :bank_cd
とすればいいのですが、(もちろんbelongs_toの方も同様に直してください)

しかし、そもそも論、リレーショナルデータベース(RDB)でStringを関連(主キー)に使うのはお勧めできません。
データが増えてくると明らかな速度低下が想定されます。
RDBに関する見識があれば色々とできないことはないのですが…。Railsの利便性を捨ててまで
bank_codeにこだわる意味はないかと思います。

Railsはレールに乗っていれば周辺知識が不十分でもなかなかなものが作れるのがウリですので。

確信がなければ素直にRailsに乗ってモデルを作り直すことをお勧めします。と言っても、bank_idを追加するだけですが。

投稿2017/06/23 08:11

編集2017/06/23 08:39
moke

総合スコア2241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ak_suzuki

2017/06/26 10:36

ありがとうございます。何分初心者なもので、ご指摘いただいた前提やStringを主キーに使うのはお勧めでない点など、大変参考になりました。 bank_idを使っていない理由は、全銀コードという所与の値を使いたかったので、idのようにDB側で自動的に付番されるのは難しいかも?と思ったからです。 自分の習熟度が低く、まだやりたいことができてはいませんが、いったんクローズします。 ありがとうございました。
moke

2017/06/26 10:53 編集

私も全銀を運用中です^_^ でも、ユーザーに編集させるものでは無いと思いますよー マスターを作って管理者が編集するのがいいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問