2017-03-19 14 views
1

UserEmailの2つのモデルがあります。明らかなように、ユーザーにはsenderrecipientというメールが届きます。Rails列と整数配列

は、アソシエーションを取得しています方法ですUserモデル

has_many :sent_emails, class_name: "Email", foreign_key: "sender_id" 
    has_many :received_emails, class_name: "Email", foreign_key: "recipient_id" 

Emailモデルで

belongs_to :sender, class_name: "User", primary_key: "id" 
    belongs_to :recipient, class_name: "User", primary_key: "id" 

では、それのは情報だけのためだった、問題がある:私はccbccとして他の2つの列を持っていますas

add_column :emails, :cc, :integer, default: [], array: true 
add_column :emails, :bcc, :integer, default: [], array: true 

これらの列でも電子メールとユーザーとの関連付けを行いたいと思います。

=> #<Email id: nil, sender_id: 5, recipient_id: 10, body: "Hello its first email.", subject: "Hello Hello", state: 1, head: nil, tail: nil, created_at: nil, updated_at: nil, cc: [9, 8], bcc: [4,19]> 

、私が追加した場合ように、私は私がユーザーを取得することができます Email.first.ccEmail.first.bccを行うことができるように、私は、ユーザーを取得することができます Email.first.senderまたは Email.first.recipientを行うことができたよう。

User.first.sent_emailsUser.first.received_emailsのように、私はUser.first.cc_mailsまたはUser.first.bcc_mailsを得ることができますか?

このような関連付けが可能ですか?

+0

なぜ1対多テーブルではなく、pg配列を使用するのですか? –

+0

どのように?私はそれをどうやって考えていないのですか? –

+0

実際には1つのメールに多くのCCまたはBCCが存在することになりますが、 –

答えて

0

残念ながら、この種の構造ではRailsはhas_manyの関係をサポートしていません。 has_and_belongs_to_manyまたはhas_many :through関連付けを使用するために関係のこの種を構築するためのより多くの慣用レールウェイ

class User < ActiveRecord::Base 
    ... 

    def cc_mails 
    Email.where("? = ANY (cc)", id) 
    end 

    def bcc_mails 
    Email.where("? = ANY (bcc)", id) 
    end 
end 
0

:しかし、あなたは手動方法cc_emailsbcc_emailsを作ることができます

http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

これはピボットを使用します。データベースの整数配列の代わりにテーブルを使用します。このためのデータベーススキーマの作成方法については、上記のリンク先のドキュメントに記載されています。あなたは、その後のようなユーザーモデル何かに関連付けを定義することができ

:このスキーマおよびこれらの関連を使用して

has_many :ccs has_many :ccd_emails, through: :ccs

、ActiveRecordのはあなたにどの意志User#ccd_emailsUser#ccd_email_ids含めて、内蔵たい機能を、与えますユーザーインスタンスまたは整数のIDの配列のような表現をそれぞれ与えます。

これはまた、異なるデータベースに対して100%移植可能であるという利点を有する。

関連する問題