当我可以嵌入关联对象并使用has_one
和/或composed_of
时,为什么我应该使用serialize
关联(以及其他表格,模型)。在我总是加入关联对象而不需要复杂查询的情况下。例如:
狗(颜色,重量)has_one :head
头部(teeth_count,eye_color)
我可以用Dog替换(颜色,重量,head_teeth_count,head_eye_color)并使用“计算属性”或值对象,如
composed_of :head, mapping: [%w(head_teeth_count teeth_count), %w(head_eye_color eye_color)]
表格更少,更简单,代码更清晰,模型更少,不会出现意外的额外查询,性能更佳。
另一个例子:
用户(电子邮件)has_many :roles
角色(姓名)
转换为用户(电子邮件,角色)
serialize :roles, Array
我在这些案件中遗漏了什么?
答案 0 :(得分:4)
语义,这实际上是编写优秀软件的一个非常重要的部分。
一本书不是由作者组成的。一本书有作者。
我还会争辩说你对你的例子更简单或代码更清晰是非常错误的。性能改进值得商榷,而且可能微不足道。
你的最后一个案子特别糟糕。如果要搜索特定角色中的所有用户,该怎么办?实例化所有用户,反序列化并一次检查一个用户?