• 締切済み

ruby on railsにおけるモデルの関連付け

ruby on rails のアソシエーションについて。 ruby on railsにおける、リレーショナルデータベースの作成についての質問です。 現在、 name,yomi,commentのカラムを持つnamesテーブル name1,name2,groupname,commentのカラムを持つgroupsテーブルをscaffoldにて作成しております。 この2つのテーブルを関連付けをしたいと考えています。 具体的には、 name1とname2を、それぞれnamesテーブルの中のnameを参照して使用したいと考えています。 各モデルのプログラムは以下のようになっています。 name.rb class Name < ActiveRecord::Base has_many :group attr_accessible :name :yomi :comment end group.rb class Group < ActiveRecord::Base attr_accessible :name1, :name2, :groupname, :comment end おそらく、groupテーブルに、name_idというカラムを追加し、nameテーブルにはhas_many :groups を追加する。といった形で良いかと考えていましたが、うまくいきません。 どのような形で実装すればよいか教えていただけないでしょうか。 また、もう1点、現在groupテーブルをweb上から登録する機能を作っています。 仕様としては、入力したname1,name2がすべてnamesテーブルのnameに含まれていれば、 name1,name2,groupname,commentすべてを登録、 いずれかあるいは両方が含まれていなければ、nameの登録画面へリンク、 となります。 現在実装中のプログラムのコントローラー部分(一部)は以下のようになります。 def create tag = params[:tag] @groups = Group.new もし、name1 name2 がnam2に含まれているならば、 @groups.name1 = tag[0] @groups.name2 = tag[1] @groups.groupname = tag[2] @groups.comment = tag[3] そうでなければ、 redirect_to name 登録画面 このような形で考えています。 こちらも、どのように実装すればよいか教えていただけないでしょうか? railsのバーションは3.1です。

  • Ruby
  • 回答数2
  • ありがとう数1

みんなの回答

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

多対多ですね。 バージョンにもよるみたいですが、中間テーブルのidは無い方が良さそうです。 rails consoleを使うとコマンドエラーも確認できますので、手がかりにしてみてください。 それと >そして、nameテーブルに、group_idを追加しました。 中間テーブルにgroup_idがありますので、必要有りません。 こちらはrails 4.0ですが、 schema.rbが ActiveRecord::Schema.define(version: 20130901100255) do create_table "groups", force: true do |t| t.string "groupname" t.string "comment" t.datetime "created_at" t.datetime "updated_at" end create_table "groups_names", id: false, force: true do |t| t.integer "name_id" t.integer "group_id" end add_index "groups_names", ["group_id"], name: "index_groups_names_on_group_id" add_index "groups_names", ["name_id"], name: "index_groups_names_on_name_id" create_table "names", force: true do |t| t.string "name" t.string "yomi" t.string "comment" t.datetime "created_at" t.datetime "updated_at" end end name.rb class Name < ActiveRecord::Base has_and_belongs_to_many :groups end group.rb class Group < ActiveRecord::Base has_and_belongs_to_many :names end groups_names.rb class GroupsNames < ActiveRecord::Base end です。 has_and_belongs_to_manyを使っていますので、細かいところは異なります。 ただし、nameやgroupが削除されたときに中間テーブルの該当するデータが残る可能性がありますので、 :dependent => :destroy を加える方が良いかもしれません。 has_and_belongs_to_manyは:dependent => :destroyを入れなくても自動で削除されるようです。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

二人でグループを作るということでしょうか? まず前半だけ 同じ人が複数のグループに属さないという前提でしたら、1対多でいけます。 namesテーブルをname,yomi,commentに加えてgroup_idを追加します。 groupsテーブルはgroupname,commentだけにします。 class Name < ActiveRecord::Base の方は、 belongs_to :group class Group < ActiveRecord::Baseは has_many :names にします。 もし、同じ人が複数のグループに属すのでしたら多対多にします。 has_many と:throughで検索で検索すれば出てきます。 グループで2人なのか、それ未満なのかは、グループに属する人数を数えて判断します。

hamakou789456
質問者

補足

回答ありがとうございます。 仕様としては、グループの人数は二人固定で、同じ人が複数のグループに属するという想定で考えています。 has_manyとthroughで調べた結果、以下のようにプログラムを変更してみました。 name.rb has_many :names_groups has_many :groups, through => :names_groups group.rb has_many :names_groups has_many :names, :through => :names_groups また、中間テーブルとして、names_groupsモデルを作成しました。 names_groups.rb belongs_to :name belongs_to ;group names_groupsのマイグレーションファイル class CreateNamesGroups < ActiveRecord::Migration def change create_table :names_groups do |t| t.references :name t.references :group t.timestamps end add_index :names_groups, :name_id add_index :names_groups, :group_id end end そして、nameテーブルに、group_idを追加しました。 このような形で大丈夫でしょうか?

関連するQ&A

  • Ruby on Railsで入力フォームを作成しています。

    Ruby on Railsで入力フォームを作成しています。 そこで、入力されたid(table.id)と商品名カラム(table.product_id) を結合して商品ID(table.product_number)を 登録時に商品IDカラムに登録できないかと思っています。 商品名カラムは商品テーブルから読み込んでいます。 恐らく、callbackのしくみを利用すればできるのではないかと 思っているのですが、やり方がわかりません。 以上、よろしくお願いします。 環境は以下のとおりです。 ruby1.8.6 rails 2.3.5 db:mysql gems:1.3.5

  • Ruby on RailsでDBカラムにハイフン

    初歩的な質問で恐縮です。 Ruby on Rails でDBのカラムにハイフンは使えますでしょうか。 多言語対応で中国語などを扱っているのですが、 カラム名が name_zh-tw のようなものがあるのですが、値が取得できずに困っております。。 例) Items テーブルに name_zh-twがある場合。 @item = Items.find_by_i(1000) @item.name_zh-tw =>NoMethodError: undefined method `name_zh' for #<Item:0xb605f364> のようになってしまいます。。 また、上記以外の箇所でもダブルクォートで囲ったら大丈夫な場合がありますが、ログには警告がでます。これは仕方ないのでしょうか。。 [WARN] Exception occurred during reader method compilation. [WARN] Maybe name_zh-tw is not a valid Ruby identifier? [WARN] compile error ----- 環境は以下の通りです。 何卒よろしくお願いいたします。 Ruby1.8.7 Rails2.3.15 MySQL5.5

    • ベストアンサー
    • Ruby
  • Ruby on Rails4 外部キーの渡し方

    Rails4の初心者です。 例えば、生徒の情報の一覧ページから[評価する]というリンクを押して生徒の成績をつける時、どのようにすれば生徒を一意に識別する情報を評価ページ(newアクション?)に受け渡してevaluationテーブルに登録(insert)できるでしょうか。 <画面イメージ>(students.index):scaffoldによって生成されたindexアクション 生徒名 年 組 番号 [評価する] 生徒名 年 組 番号 [評価する] 生徒名 年 組 番号 [評価する]     ・・・ <各モデル>(id, 更新日時などのデフォルトのカラムは省略) studentsモデル name:string, nen:integer, kumi:integer, num:integer evaluationモデル shusseki:integer, test:integer, taido:integer, student_id:integer データを渡すということは、formで情報をpostするのかと考えたのですがどうも実装方法が思いつきません。 よろしくお願いいたします。

  • rails3初心者 検索対象に別テーブルも含めたい

    ご教授よろしくお願いします。 <実装したい事> productテーブルからmakerテーブルのmaker_nameカラムも検索条件に含めたい。 (productテーブルの検索対象カラムは:codeとname ) (makerテーブルの検索対象カラムは:maker_name ) 以下のコードで試してみましたが、実装できません。 ========================= views ========================= <%=form_tag({:controller => :products,:action => :search}, :method => :get) do %> <%= text_field_tag "search_form",params[:search_form],:size =>25 %> <%= submit_tag '商品検索' %> <% end %> ======================================== products_controller.rb ======================================== def search @products =Product.find(:all, :include => :maker, :conditions =>['maker.maker_name like :value or code like :value or name like :value', {:value=> '%' +params[:search_form]+ '%'}]) end ======================================== リレーションシップ ======================================== product.rb belongs_to :maker **************************** maker.rb has_many :products **************************** どうぞよろしくお願い致します。

  • Rails3でのYAMLファイルのtメソッド呼出し

    config\locales\translation_ja.ymlファイルを下記のように編集して、 ja: activerecord: models: demandapp: "要望" #g attributes: demandapp: acquisition: "補足" #g class1: "大分類" #g class2: "分類" #g content: "内容" #g derivery: "納期" #g report_count: "件数 #g" source: "提起" #g state: "状態" #g これをviewのindexから下記のように、I18n.tメソッドを使って日本語訳を呼び出そうとすると、 <% Demandapp.column_names.each do |col| %> <th> <%= t("activerecord.attributes.demandapp.#{col}") %> # <ーここ </th> <% end %> I18n::InvalidLocaleData in Demandapps#index can not load translations from c:/user/Ruby193/rails/demand/config/locales/translation_ja.yml, expected it to return a hash, but does not #の所でエラーが出て理由が分かりかねています。 ご経験のある方、御教示願えればと思います。

    • ベストアンサー
    • Ruby
  • group byを使う時に条件をつけたいです。

    どう頑張っても思いどうりにDBからデータがとれず困ってます... 例えばこんなテーブルがあったら(テーブル名が"test"、カラムが"name"と"id") table test name | id ---------- aa | 1 aa | 1 aa | 1 bb | 1 bb | 1 aa | 0 aa | 0 cc | 0 カラム"id"が0の時は、カラム"name"のgroup byせず カラム"id"が1の時だけ、カラム"name"のgroup byするには、どうすればいいのでしょう? このような感じにデータを取り出したいのです。 name | id  | COUNT ---------- aa | 1 | 3 bb | 1 | 2 aa | 0 | 1 aa | 0 | 1 cc | 0 | 1 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Railsで、最終更新レコードを取得するには?

    Ruby on Rails 4.1.2 を学習しています。 [1] pry(main)> Entry.all Entry Load (0.1ms) SELECT "entries".* FROM "entries" +----+--------+--------------+---------------------------+ | id | name | comment | updated_at | +----+--------+--------------+---------------------------+ | 1 | Taro | 楽しみです | 2014-09-16 20:00:00 +0900 | | 2 | Jiro | わくわく | 2014-09-16 20:20:00 +0900 | | 3 | Saburo | 頑張ります | 2014-09-16 20:10:00 +0900 | +----+--------+--------------+---------------------------+ Entryモデル(テーブル)で、最後に更新したレコードを取得するにはどのようにしたら良いでしょうか? 最終更新日が2014-09-16 20:20となっているid=2のレコードを取得したいのです。 Entry.find(2)とすれば、もちろん取得できるのですが、それではあんまりですし。 よい方法を教えて頂けないでしょうか? どうぞよろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • comment on columnについてわからなくて困っています。

    CREATE TABLE の中で各列にコメントをつける方法はありますか? できなければ、以下の方法では、 ORACLE Express EditionのSQL実行で、 下記のコメントを一行ずつしか実行できないのですが、 1回で実行する方法はありますか? □作りたいテーブル CREATE TABLE DB_USER_MST ( DB_USER_ID VARCHAR2(5) NOT NULL, DB_PASSWORD VARCHAR2(5), DB_NAME VARCHAR2(30), DB_POSTCODE NUMBER(7), DB_PREFECTURE_ID NUMBER(2), DB_ADDRESS VARCHAR2(100), DB_TELEPHONE NUMBER(11), DB_SEX NUMBER(1), PRIMARY KEY (DB_USER_ID) ) □付けたいコメント COMMENT ON COLUMN DB_USER_MST.DB_USER_ID IS 'お客様ID' COMMENT ON COLUMN DB_USER_MST.DB_PASSWORD IS 'パスワード' COMMENT ON COLUMN DB_USER_MST.DB_NAME IS 'お名前' COMMENT ON COLUMN DB_USER_MST.DB_POSTCODE IS '郵便番号' COMMENT ON COLUMN DB_USER_MST.DB_PREFECTURE_ID IS '県ID' COMMENT ON COLUMN DB_USER_MST.DB_ADDRESS IS 'ご住所' COMMENT ON COLUMN DB_USER_MST.DB_TELEPHONE IS 'お電話番号' COMMENT ON COLUMN DB_USER_MST.DB_SEX IS '性別'

  • Ruby と Ruby on Rails

    Ruby と Ruby on Railsは何が違うんでしょうか? 漠然とした質問ですいません。

    • ベストアンサー
    • Ruby
  • Ruby on rails のモデルオブジェクト

    Ruby on Rails を勉強しているんですが、細かいところで @member = Member.find(1) という風に作成したモデルオブジェクトについてですが、 @memberとういう変数から、Memberモデルの主キー名を取得することができるでしょうか。 ※または、@memberから、Memberクラスが取得できるか。 @member.reflectionsなど、いろいろためしましたができませんでした。 お分かりの方がいらっしゃいましたら、是非お教え願えないでしょうか。

    • ベストアンサー
    • Ruby