Rails列与整数数组的关联

时间:2017-03-19 16:22:46

标签: ruby-on-rails activerecord pg

我有2个模型UserEmail,因为很明显用户会收到一封电子邮件,senderrecipient

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"

这就是获取关联的方式,这仅供参考,问题是:我有其他2列ccbcc

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.senderEmail.first.recipient我可以吸引用户,因此我可以Email.first.ccEmail.first.bcc我可以获得用户。

我可以User.first.sent_emailsUser.first.received_emails,我可以User.first.cc_mailsUser.first.bcc_mails

这样可以建立这种关联吗?

2 个答案:

答案 0 :(得分:1)

不幸的是,Rails不支持has_many这种结构的关系。但您可以制作手动方法cc_emailsbcc_emails

class User < ActiveRecord::Base
  ...

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

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

答案 1 :(得分:1)

构建此类关系以使用has_and_belongs_to_manyhas_many :through关联的更惯用的rails方式:

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,它们将分别为您提供类似于User实例或整数ID的数组表示。 / p>

这也具有100%可移植到不同数据库的优势。