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 现在支持枚举,因此您可以在主题字段中查看它。
根据您最终拥有的笔记数量,您可能需要考虑在主题字段上添加索引。
我有一个名为 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 现在支持枚举,因此您可以在主题字段中查看它。
根据您最终拥有的笔记数量,您可能需要考虑在主题字段上添加索引。