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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

2回答

2391閲覧

railsにおけるレコードの紐づけ

tsukatsuka

総合スコア7

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2016/07/13 06:49

railsを使ってwebアプリケーションの開発をしています。
今回2つのテーブルにおけるレコードの紐づけにつきまして分からずアドバイスを頂きたいです。

以下のテーブルは例なのですが、
・classテーブルとnameテーブルを作成
・classテーブルにはid,first,lastの3つフィールド
・nameテーブルにはidフィールド

2つのテーブルの関連付けは出来ている
・(class.rb)
has_many :name
・(name.rb)
belongs_to :class

上記を前提に、nameテーブルにfull_nameというフィールドを作成
そこでfull_nameにclassテーブルのfirst,lastを結合したレコードを挿入したいです。

(first + last) → (full_name)

この作成ができずrailsではどの様に作成するかアドバイスをお願いします。

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

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

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

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

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

guest

回答2

0

full_nameフィールドをDBに追加してあり、そこにfirstとlastを結合した値を格納したい、という要求だとのコメントがあったので、それに合わせた方法を書きます。

基本的に、before_saveフィルタでfirstとlastをくっつけてfull_nameに格納し、保存する、という方法が一般的ではないかと思います。

Ruby

1class Name < ActiveRecord::Base 2 belongs_to :class 3 attr_accessor :first, :last, :full_name 4 before_save :set_full_name 5 6 def set_full_name 7 self.full_name = self.first.to_s + self.last.to_s 8 end 9end

まあ、仕様の問題なのであまり深くは言いませんが、firstとlastがあるのに、わざわざくっつけたfull_nameをDBに保存するのはあまり筋が良くない気がします。
文化圏によって、姓->名の順か、名->姓の順か異なったり、姓と名の区切りの文字を途中で替えたくなったりした時に、full_nameフィールドの値を全部書き直す必要が出てきちゃったりするので。

投稿2016/07/14 08:40

rifuch

総合スコア1901

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

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

0

ベストアンサー

ええと、DBのフィールドを追加したいという事ではないですよね?
nameクラスのインスタンスにアクセスして、full_nameという名前でfirst,lastを結合した名前を取得したいだけですよね?
という前提なら、nameクラスにfull_nameメソッドを追加します。

Ruby

1class Name < ActiveRecord::Base 2 belongs_to :class 3 attr_accessible :first, :last 4 5 def full_name 6 return self.first.to_s + self.last.to_s 7 # to_sしているのは、もしかすると空だったりするから。 8 # presence: trueのバリデーションしてるなら不要 9 end 10end

こうやってあげれば、たとえば姓と名の間に半角スペースをつけてあげたくなったときとかにも楽に対応できます。

投稿2016/07/13 09:24

編集2016/07/14 06:16
rifuch

総合スコア1901

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

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

tsukatsuka

2016/07/14 06:09

すみません、上記の方法ですとfirstとlastがundefined methodとなってしまいます。調べたのですが、解決できず度々申し訳ありませんがご教授頂けないでしょうか?
rifuch

2016/07/14 06:16

すみません、self.を付け忘れてました。 回答の方も修正しておきます
tsukatsuka

2016/07/14 06:55

ありがとうございます。 attr_accessibleをattr_accessorに変更してエラーはでなくなりました。ただ、dbを確認してもfull_nameがnullになってしまっています。何度もすみません、データの格納する記述が必要なのでしょうか?
rifuch

2016/07/14 08:32

> attr_accessibleをattr_accessor すみません。単純ミスでした。 > dbを確認してもfull_nameがnullに 前提として、「DBのフィールドを追加したいという事ではないですよね?」と言う事で回答してました。 firstとlastをくっつければfull_nameになるので、重複するデータを格納させる意味はないと思ったからです。 あくまで、full_nameフィールドを追加して、それに格納したいのであれば、別に回答します。
tsukatsuka

2016/07/15 00:27

何度もありがとうございます。 私の質問の仕方が悪かったです、すみません。 今回のゴールとしまして、full_nameを使ってselectで選択できるようにして、nameのデータを絞りこみたいです。 2つのモデル間で、別のモデルのデータ(今回はfirst,last)をつかってview/name/indexで絞り込むうえで、データが扱えなかったので、nameにfull_nameというフィールドを作成し、そこにデータをひっぱてきてselectを作成しようと考えてました。 だいぶ手こずっており、もしrails特有の解決方法がありましたらそちらでも構いませんのでご教授頂けないでしょうか?
rifuch

2016/07/15 07:59

すみません、状況が把握できなくなりました。 モデルクラスのNameクラスに、first,last二つの属性があるのだと思っていましたが、 > 2つのモデル間で、別のモデルのデータ(今回はfirst,last)をつかってview/name/indexで絞り込むうえで、 という事は、firstとlastはNameクラスの属性ではない、という事でしょうか? だとしたら、firstとlastを持つクラスの名前と、Nameクラスとの関連を教えてください。 関連さえあれば、別クラスの属性であっても、検索の条件にする事は可能です。
tsukatsuka

2016/07/15 08:08

ご回答ありがとうございます。 nameクラスとは別にfirst,lastを持つクラスがあります。 今回はclassという名前にさせて頂いてます。 関連としましては、 ・(class.rb) has_many :name ・(name.rb) belongs_to :class この関連で、nameクラスのview/indexページにセレクトボックスを作成。 classクラスのfirst,lastを連結したレコードをこのセレクトボックスでプルダウン一覧として表示させたいです。 何度もすみません、、宜しくお願い致します。><
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問