Ruby 在 Rails - 模型设计

Ruby on Rails - Model Design

我有一个名为 Note 的模型,用户可以在其中对不同的主题做笔记:

rails g scaffold Note sub1:text sub2:text sub3:text ... user:references

一个 User 模型 has_one :note 和一个 Note 模型 belongs_to :user

这是否正确,如果不正确,最好的方法是什么?

编辑:

让我们按照下面的答案中的建议说,我将制作用户模型 has_many 笔记,而笔记模型将只有两个属性 content:text 和 subName:string 然后使用范围我可以得到属于特定主题的笔记,这样好吗?

这取决于您的用例。是的,此代码将 运行,但我从您的描述中了解到 User 应该能够拥有多个 note。如果是这种情况,您实际上想在 User 模型中使用 has_many :note 关联。

此外,使用编号列作为允许记录有多个值的方式通常是一种不好的做法。相反,您可能想要创建一个 Subject 模型并在它与 Note documentation 之间建立一个 has_and_belongs_to_many 关联。


编辑以响应 OP 编辑​​: 是的,您可以这样做。但是,现在您将失去为单个笔记设置多个主题的能力。但是如果你对每个笔记只有一个主题没问题,那么你所拥有的就可以工作并且比创建一个全新的模型更简单。

但是请注意,这也有缺点。如果您想搜索所有主题为 "apples" 的帖子,您将不会得到任何用户将 "Apples"(大写 "A")作为主题或“Apples”的帖子"(在 space 之前)或 "Apples "(在 space 之后)等。您可以使用规范化 subject 文本的 before_save 挂钩来克服这个问题,但是语义相同的拼写错误或冗余 subject?即使使用模型也不容易解决这些问题,但是 会容易得多,特别是如果您将用户的选择限制在现有主题上。

您还将要求数据库使用字符串评估作为您的谓词,相对于在受限 Subject table 上执行连接,如果数据集,这可能有也可能没有性能缺陷变得足够大。

最后,无论哪种方式,如果您打算使用该列来搜索特定的 Note 记录,您应该为它创建一个索引。

我认为如果您只有几种主题类型,这是一种很好的方法。

Rails 现在支持枚举,因此您可以在主题字段中查看它。

根据您最终拥有的笔记数量,您可能需要考虑在主题字段上添加索引。