10854


InquiryType（お問い合わせ種類）とInquiryContent（お問い合わせ内容）というモデルがあり、それぞれ以下の要素を持っています。Railsのマイグレーションファイルを書きます。

InquiryType:

[code]

    class CreateInquiryTypes < ActiveRecord::Migration
      def change
        create_table :inquiry_types do |t|
          t.string :name
          t.timestamp :created_at
        end
      end
    end
    
[/code]

InquiryContent:

[code]

    class CreateInquiryContents < ActiveRecord::Migration
      def change
        create_table :inquiry_contents do |t|
          t.string :name, null: false
          t.string :mail_address, null: false
          t.integer :inquiry_type_id, array: true
          t.string :content, null: false
          t.timestamp :created_at
        end
      end
    end
    
[/code]

InquiryContentはinquiry_type_id（InquiryTypeのid）要素を持ちますが、配列でもっています。

具体的に以下のようなことをやりたいです。

例えば、InquiryContentの最初のレコードの`inquiry_type_id`の値が`[1, 3, 4, 5]`を持っているとします。  
その上で、`InquiryContent.first.inquiry_type`のようなコードの書き方で該当するInquiryTypeのレコードを全て抽出できるようにしたいと思っています。

その場合、どのような関連を書けばよいでしょうか？  
もしくはモデル設計を変えた方が良いでしょうか？

ちなみにInquiryContentに`belongs_to :inquiry_type`、 InquiryTypeに`has_many
:inquiry_contents`の関連を書きましたがダメでした。。  
このように関連を書くと`InquiryContent.first.inquiry_type`で`nil`が返ってきてしまいます。


CC BY-SA 3.0
2015-05-30T03:52:17.263
10787
2015-06-01T14:53:19.757
8558
question
ruby-on-rails ruby postgresql
配列の要素を持つモデルに対して関連付けを書く方法を教えてください


Railsのアソシエーション機能を **利用せず** に `InquiryContent#inquiry_types`
で該当するInquiryTypeのリストを得たいだけであれば、次のように定義することで可能です。

[code]

    class InquiryContent < ActiveRecord::Base
      ...
      def inquiry_types
        InquiryType.where :id => inquiry_type_id
      end
    end
    
[/code]

Railsの流儀で (アソシエーションを使って) 処理したい場合には、PostgreSQL独自の "配列" を利用せずに `has_many
:through` を使用した N:N の関係を定義する必要があります。

参考: [Active Record の関連付け
(アソシエーション)](http://railsguides.jp/association_basics.html)


CC BY-SA 3.0
2015-06-01T14:53:19.757
10854
2015-06-01T14:53:19.757
76
10787
answer