2014-07-05 66 views
2

比方說,我有一個Rails應用程序,每個使用它的人都是一個正方形。大多數人只是廣場,但有些人可以同時作爲正方形和三角形。
三角形會有不同的(更)比方形等不同長度的邊,三角形的類型等屬性 上has_many :through閱讀後,我不知道我是否應該Rails對象關係

  • 創建加入表格或

  • 只有一些額外的屬性默認爲nil,除非用戶能夠充當三角形。

如果我確實創建了一個連接表,那麼我會在連續的正方形上創建三角形的連接嗎?
七月四日快樂!

+0

我想你想要的是[單表繼承(http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Single+table+inheritance) –

回答

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(單個數據庫表)
  • 你想考慮系統中特定形狀的作用(如何你會叫方/三角ngle)
  • 不同元素如何影響系統(您是直接還是間接調用Triangle)?
+1

我只是想你需要''has_many:用戶'在Shape類中,因爲其他的繼承於此並且將具有相同的行爲 –

+0

感謝芽!現在會改變 –

0

如果我正確理解你的問題,你真的不需要關係has_many :through

我建議將其設置是這樣的:

用戶

belongs_to :square 
belongs_to :triangle 

廣場

has_many :users 

三角

has_many :users 

這些協會需要對用戶的外鍵標籤樂。