Rails 模特协会
Rails model associations
我在想出一种在我的 Rails 应用程序中的两个不同模型之间建立关联的好方法时遇到了问题。
目前我有一个 Person 模型和一个 Note 模型。一个人可以是笔记的作者或主题。因此:
- 一个person可以属于很多notes(作为主题)。
- 一个人可以有很多笔记(作为作者)。
- 一个 note 属于一位作者 (person)。
- 一个note可以有一个主题(person)。
我想该应用程序需要显示 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_id
和 author_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
我在想出一种在我的 Rails 应用程序中的两个不同模型之间建立关联的好方法时遇到了问题。
目前我有一个 Person 模型和一个 Note 模型。一个人可以是笔记的作者或主题。因此:
- 一个person可以属于很多notes(作为主题)。
- 一个人可以有很多笔记(作为作者)。
- 一个 note 属于一位作者 (person)。
- 一个note可以有一个主题(person)。
我想该应用程序需要显示 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_id
和 author_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