Rails - 复杂 model/associations

Rails - complex model/associations

在我正在构建以学习 rails (RAILS 5) 的应用程序中,我尝试获得以下最终结果:

我希望用户能够标记 PDF 的内容(附加到注释记录或文档记录)。在 PDF 所附的注释或文档已按文档类型(例如 PO、送货单等)class 化之后。标签在添加时与预定义的标签类型列表相关联(将文档的注释文档类型与标签类型的文档类型相匹配)。添加标签时,我想捕获被标记的内容(例如采购订单号或订购者名称)和PDF中的坐标。

问题的第一部分

2对象(classes/models)Annotation和Document与对象(class/model)Tag(类似于order to order_item):

has_many :tags, dependent: :destroy

模型 Tag 与模型 TagType 具有一对一关系:

belongs_to :annotation, :document

然而,单个标签记录只能属于一个注释/文档,并且需要在删除相应的注释/文档时将其删除(我为此设置了 dependent: :destroy)。

那么,Tag 与 TagType 之间的关联类型是什么? has_onehas_manybelongs_to_...?

问题的第二部分:

现在,当将标签添加到注释或文档时,标签将提取文本、坐标,并且需要分配给标签类型。但是,某些标记类型(对于注释或文档的文档类型)只能用于一个注释/文档一次——取决于 tag_type 字段 "multiple occurrence" 是否为假。在关联中如何/在哪里设置此(验证/过滤器)?

以及如何根据适当的标签(动态地)减少列表?

欢迎所有建议/指导!

第一部分:

对于Tag和Tag_type(TagType)模型的关联,可以在一个模型中使用belongs_to,在另一个模型中使用has_one。例如,Tag 模型可以有 belongs_to :tag_type, inverse_of: :tag,TagType 模型可以有 has_one :tag, inverse_of: :tag_type。哪个模型使用 belongs_to 和哪个使用 has_one 关联将取决于外键的位置。例如,如果标签 table 有一个 tag_type_id 列,上面的代码将起作用(具有 belongs_to 关联的模型应该包含另一个 table 的 id;看这个答案:).

第二部分:

我假设 TagType 模型与 Annotation 或 Document 之间没有直接关联,并且 Tag 和 Annotation/Document 模型之间以及 Tag 和 TagType 模型之间存在关联。同样,验证应该在 Tag 和 Annotation/Document 之间的关联中包含外键的模型中进行。由于 Annotation/Document 和标签模型之间的关联是 has_many,我假设标签 table 将持有外键。在这种情况下,验证应该在标签模型中进行,这样当您将 Annotation/Document 关联到标签时,验证就会触发。