2013-01-11 110 views
1

這裏是我的架構:如何在Rails中爲兩個表之間的兩種不同類型的關係設置has_many關係?

Participant = 
    id: int 
    user_id: int 
    program_id: int 
    ... other fields 
end 

User = 
    id: int 
    name: text 
    ... other fields 
end 

Program = 
    id: int 
    user_id: int # this is the manager of the program 
end 

所以,在英語:

  • 用戶是人。
  • 程序由用戶管理。
  • 的程序也有一組參與者,每一個都是用戶在Rails的

所以:

class Participant 
    belongs_to :user 
    belongs_to 
end 

class User 
    has_many :programs 
    has_many :participants 
end 

class Program 
    has_many :participants 
    belongs_to :user 
end 

注意,一個用戶真正的has_many程序,它們管理的那些, 。以及通過參與者的has_many程序,這是所有他們參加節目

我要的是能夠說:

  • a_user.manages_programs
  • a_user.participates_in_programs

所以用戶的has_many程序兩種口味。我需要做一些神奇的組合:through,:as,:class,或者沿着這些線的東西,但是到目前爲止我無法弄清楚。

繼續這個例子的另外一個問題。我現在有

class User 
    has_many :participations, class_name: "Participant" 
    has_many :moderated_programs, class_name: "Program", foreign_key: 'moderator_id' 
    has_many :participating_programs, through: :participations, class_name: "Program", source: :program 
end 

class Participant 
    belongs_to :user 
    belongs_to :program 
end 

注意第三行。我想要的是利用這一系列的關聯:參與者有一個user_id和一個program_id。我希望能夠說出u1.participating_programs並獲得一個或多個此用戶參與的程序的列表,但以上操作無效。你能說出我在哪裏嗎?

回答

2

我同意查爾斯,你有一些措詞/語言問題,令人困惑的事情。參與可能是一個更好的術語。我不會在這裏推薦多態 - 用戶可能有兩個不同的角色,但用戶不會是不同的類型。特別是如果經理也可能成爲參與者...

class User 
    has_many :participations 
    has_many :programs, through: :participations 
    has_many :managed_programs, class_name: 'Program' 
end 

class Program 
    belongs_to :manager, class_name: 'User' 
    has_many :participations 
    has_many :users, through: :participations 
end 

# Just a join table. Nothing special 
class Participation 
    belongs_to :user 
    belongs_to :program 
end 
+0

不錯的完善和我認爲你回答我的跟進查爾斯 – pitosalas

+0

他呢! :-)你應該接受他的答案,它會向你展示你需要的一切。 – weltschmerz

+0

'has_many:managed_programs,class_name:'Program''如何知道程序中應該看到的外鍵叫做'user_id'?因爲該子句在'class User'中找到?所以如果爲了提高準確性,我想將Program中的外鍵改爲'manager_id',那麼我需要做些什麼? 'has_many:managed_programs,class_name:'Program',foreign_key:'manager_id'? – pitosalas

1

首先,只是一種語言:我不認爲用戶有很多參與者。他一位參與者或他一個程序的經理。所以他有很多參與。

你可以這樣寫如下:

class User 
    has_many :participations, class_name: "Participant" 
    has_many :managed_programs, class_name: "Program" 
end 

此外,至少在你的代碼上面,參與者類缺少

belongs_to :user 

因爲它看來,你需要兩個不同的區分用戶類型,polymorphic功能將派上用場。那麼你不需要額外的參與者表。 See here

+0

謝謝!是那些錯別字還是我錯過了什麼?shouldnt「class:」be「class_name:」?和「:參與者」是「參與者」? – pitosalas

+0

謝謝,你是對的!我相應地更新了答案。 – weltschmerz

+0

好吧,這看起來不錯。跟進:我想獲得一組該用戶參與的程序,例如用戶 - >參與者 - >程序。這是一個'通過',我將如何表達? – pitosalas

相關問題