Rails对象关系

时间:2014-07-05 00:30:19

标签: ruby-on-rails orm

让我们说我有一个Rails应用程序,例如,使用它的每个人都是一个正方形。大多数人只是正方形,但有些人可以充当正方形和三角形 三角形将具有与正方形不同的(更多)属性,例如不同长度的边,三角形的类型等。 在阅读has_many :through后,我不确定是否应该

  • 创建连接表,或

  • 除非用户能够充当三角形,否则只需要一些默认为nil的额外属性。

如果我确实创建了一个连接表,我是否只会在有能力的方块上创建三角形连接? 七月四日快乐!

2 个答案:

答案 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)?
  •