Rails 模特协会

Rails model associations

我在想出一种在我的 Rails 应用程序中的两个不同模型之间建立关联的好方法时遇到了问题。

目前我有一个 Person 模型和一个 Note 模型。一个人可以是笔记的作者或主题。因此:

我想该应用程序需要显示 Person 个人资料,在其中我们可以看到 Person Notes 写了 ,以及所有 注释 写了 关于 .

建立这个模特协会的最佳方式是什么?直接还是通过中间关系模型?

提前致谢!

在我看来,最干净的方法是让笔记属于作者和主题:

class Note < ActiveRecord::base
  belongs_to :author, class_name: 'Person', foreign_key: :author_id
  belongs_to :subject, class_name: 'Person', foreign_key: :subject_id
end

class Person < ActiveRecord::base
  has_many :authored_notes, class_name: 'Note', foreign_key: :author_id
  has_many :notes_about_me, class_name: 'Note', foreign_key: :subject_id
end

您可能想更改上面关系的名称,但您明白了。

我知道我们通常不会认为关于某人的笔记属于笔记的主题。但是,从 Rails 的角度来看,belongs_to 关系允许我们将 subject_id 外键放在 notes table 上,这是最简单的解决方案。如果您要使用 has_one 关系,则必须创建一个连接 table,在我看来,这会增加不必要的复杂性。

确保您的 notes table 有两个对 persons table 的索引引用,名为 subject_idauthor_id。您可以通过这样的迁移来做到这一点:

class AddSubjectAndAuthorToNotes < ActiveRecord::Migration
  def change
    add_reference :notes, :author, index: true
    add_reference :notes, :subject, index: true

    add_foreign_key :notes, :people, column: :author_id
    add_foreign_key :notes, :people, column: :subject_id
  end
end