我有2个模型User
和Email
,因为很明显用户会收到一封电子邮件,sender
和recipient
。
在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列cc
和bcc
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.sender
或Email.first.recipient
我可以吸引用户,因此我可以Email.first.cc
或Email.first.bcc
我可以获得用户。
我可以User.first.sent_emails
和User.first.received_emails
,我可以User.first.cc_mails
或User.first.bcc_mails
?
这样可以建立这种关联吗?
答案 0 :(得分:1)
不幸的是,Rails不支持has_many
这种结构的关系。但您可以制作手动方法cc_emails
和bcc_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_many
或has_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_emails
和User#ccd_email_ids
,它们将分别为您提供类似于User实例或整数ID的数组表示。 / p>
这也具有100%可移植到不同数据库的优势。