Rails - 复杂的模型/关联

时间:2016-09-22 15:09:46

标签: ruby-on-rails ruby-on-rails-5

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

我希望用户能够标记PDF的内容(附加到注释记录或文档记录)。附加PDF的注释或文档已按文档类型(例如PO,交货单等)进行分类。添加时,标签与预定义的标签类型列表相关联(分别将文档的注释的文档类型与标签类型的文档类型相匹配)。添加标签时,我想捕获标记的内容(例如采购订单编号或订货人名称)和PDF中的坐标。

问题的第一部分

2个对象(类/模型)Annotation和Document与对象(类/模型)Tag具有1对多的关系(类似于order_item的顺序):

has_many :tags, dependent: :destroy

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

belongs_to :annotation, :document

但是,单个标记记录只能属于一个注释/文档,需要在删除相应的注释/文档时删除(我为此设置dependent: :destroy)。

那么,Tag与TagType使用哪种类型的关联? has_onehas_manybelongs_to_ ...

问题的第二部分:

现在,在向标注或文档添加标记时,标记将提取文本,坐标和需要分配给TagType。但是,某些标记类型(对于注释或文档的文档类型)只能对注释/文档使用一次 - 具体取决于tag_type字段“multiple occurrence”为false。我如何/在哪里设置(验证/过滤)关联?

如何根据标签(动态)减少列表?

欢迎所有建议/方向!

1 个答案:

答案 0 :(得分:1)

第一部分:

对于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关联将取决于外键的位置。例如,如果tags表具有tag_type_id列,则上述代码将起作用(具有belongs_to关联的模型应包含另一个表的id;请查看此答案:https://stackoverflow.com/a/3808936/6006050)。

第二部分:

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