2016-11-15 72 views
2

創建活動記錄關係的正確方法是什麼?活動記錄關聯 - 一個模型可以同時屬於不同模型

模型A的一個實例可以屬於多個另外兩個型號,B型和C型。

B型只能有一個模型A

模型C可以有很多A型的。

一個例子是僱主招聘一個職位並且候選人正在申請並擁有許多以前職位的工作板。我希望候選人和僱主職位都來自同一個模型。

位置模式(模型A) 可以同時屬於僱主和候選

僱主模型(模型B) HAS_ONE位置

候選模型(型號C) 的has_many位置

+0

此模型圖沒有多大意義 - 爲什麼僱主只能擁有一個職位? – MageeWorld

回答

1

這裏有一種方法可以完成你在問題中描述的內容:

class Position < ActiveRecord::Base 
    belongs_to :candidate 
    belongs_to :employer 
end 

class Employer < ActiveRecord::Base 
    has_many :positions 
end 

class Candidate < ActiveRecord::Base 
    has_many :positions 
ens 

請注意,一個職位一次只能屬於一個僱主和一個候選人;如果你正在創建一個工作委員會,這是無意義的 - 職位和僱主之間的關係可能是正確的,但候選人可能有很多應用程序,並且一個應用程序可能屬於某個職位,而一個職位有許多應用程序。或者也可能是「最愛」,因此候選人可以跟蹤要申請的職位列表。

,你開始與「理論」的例子:

  • 一個模型的實例可以同時屬於其他兩款機型,型號B和C型實例的倍數。
  • 模型B只能有一個模型A.
  • 模型C可以有許多模型A.

代碼:

class ModelA < ActiveRecord::Base 
    has_many :model_bs 
    has_many :model_c_relationships # join table! 
    has_many :model_cs, through: :model_c_relationships 
end 

class ModelB < ActiveRecord::Base 
    belongs_to :model_a 
end 

class ModelCRelationship < ActiveRecord::Base 
    belongs_to :model_a 
    belongs_to :model_c 
end 

class ModelC < ActiveRecord::Base 
    has_many :model_c_relationships 
    has_many :model_as, through: :model_c_relationships 
end 

如果有一種情況,其中一個類型的對象可以屬於一個其他對象,但其他對象可以是多種類型之一,那麼它可能需要一個多態關聯。例如,StackOverflow允許您對問題和答案進行評論。評論只能屬於一個可評論的父對象,因此代碼可能如下所示:

class Comment < ActiveRecord::Base 
    belongs_to :commentable, polymorphic: true 
end 

class Question < ActiveRecord::Base 
    has_many :comments, as: :commentable 
    has_many :answers 
end 

class Answer < ActiveRecord::Base 
    belongs_to :question 
    has_many :comments, as: :commentable 
end 
+0

多態關係呢?你什麼時候用這個? – mferg

+0

多態關係適用於有共享資源的情況。例如,假設你有一個應用程序......問題和答案 - 就像這樣!問題或答案都可以獲得投票,評論和最愛(明星)。因此,這些對象中的任何一個都可能與「已加星標」,「已評論」或「已投票」對象具有「belongs_to」多態關係,這可能是問題或答案。 – guiniveretoo

+0

@mferg我已經用一個多態關聯的例子更新了我的答案 – guiniveretoo

相關問題