让我们说我有一个Rails应用程序,例如,使用它的每个人都是一个正方形。大多数人只是正方形,但有些人可以充当正方形和三角形
三角形将具有与正方形不同的(更多)属性,例如不同长度的边,三角形的类型等。
在阅读has_many :through
后,我不确定是否应该
创建连接表,或
除非用户能够充当三角形,否则只需要一些默认为nil的额外属性。
如果我确实创建了一个连接表,我是否只会在有能力的方块上创建三角形连接? 七月四日快乐!
答案 0 :(得分:0)
如果我正确理解您的问题,您真的不需要has_many :through
关系。
我建议像这样设置:
用户
belongs_to :square
belongs_to :triangle
方
has_many :users
三角形
has_many :users
这些关联在Users表上需要外键。
答案 1 :(得分:0)
<强> STI 强>
除了Beerlington
的评论之外,您可能还想查看Single Table Inheritance -
#app/models/shape.rb
Class Shape < ActiveRecord::Base
has_many :users
end
#app/models/user/triangle.rb
Class Triangle < Shape
end
#app/models/users/square.rb
Class Square < Shape
end
这应该允许你设置:
#app/models/user.rb
Class User < ActiveRecord::Base
belongs_to :shape
delegate :type, to: :shape, prefix: true #-> allows you to call @user.shape_type
end
-
<强>协会强>
虽然我认为关联可能需要通过继承的模型,但此设置允许您在所需的任何文件中使用所需的属性。
例如,通过上述设置,您可以使用以下内容:
@triangles = Triangle.all
@trianbles.each do |triangle|
triangle.user.name
end
你应该考虑的一些事情:
- 您想要保留single source of truth(单个数据库表)
- 您想要考虑系统中特定形状的作用( 你将如何调用方形/三角形)
- 不同的元素如何影响系统(你直接或间接地调用Triangle)?