0

所以我試圖創建一個簡單的事件Web應用程序,其中類用戶可以創建類事件並參與它們。在用戶類創建類Event的情況下,我希望該事件屬於用戶。但是,如果同一用戶註冊參與另一個事件,我希望用戶屬於該事件,並且該事件爲has_many用戶。我不知道如何將這實際上寫在模型中。數據庫關聯,類has_many和belongs_to同一個對象?

在一種情況下類用戶是屬於事件的參與者,並且在另一個它們是在主機和belongs_to的他們的事件。如果我沒有,我不想保持這個乾燥,不要創建單獨的用戶類別(在這種情況下是主機和參與者)。單純的聯合表似乎並沒有考慮到這種有條件的關聯。任何建議最好的方式來做到這一點?

類用戶 ???

類的事件 ????

謝謝!

+0

如果你瞭解foreign_keys,你就會明白爲什麼一個連接表是必要的,這案件。當你說用戶belongs_to一個事件,你說的事件的ID是在用戶的event_id屬性,作爲一個foreign_key ...這意味着用戶一次只能屬於一個事件,沒關係,如果這是你的目的。 「幹」並不意味着沒有連接表...連接很有趣! – omarvelous

回答

2

你需要做2個協會 - 一個鏈接到創建活動,和一個鏈接到訂閱事件:

create_table :event_subscriptions do |t| 
    t.references :subscribed_user 
    t.references :subscribed_event 
end 

create_table :events do |t| 
    t.references :user 
    # other fields 
end 

class User < ActiveRecord::Base 
    has_many :events    # created Events 
    has_many :event_subscriptions, :foreign_key => :subscribed_user_id 
    has_many :subscribed_events, :through => :event_subscriptions # subscribed Events 
end 

class EventSubscription < ActiveRecord::Base 
    belongs_to :subscribed_user, :class_name => 'User' 
    belongs_to :subscribed_event, :class_name => 'Event' 
end 

class Event < ActiveRecord::Base 
    belongs_to :user    # the creating User 
    has_many :event_subscriptions, :foreign_key => :subscribed_event_id 
    has_many :subscribed_users, :through => :event_subscriptions # subscribed Users 
end 
+0

一種初學者問題,但是我必須在db/migrate文件中輸入外鍵嗎? –

+1

這就是['t.references'](http://guides.rubyonrails.org/migrations.html#special-helpers)爲你所做的。 – PinnyM

1

我會建議你使用has_and_belongs_to_many協會(文檔here)。 根據你想要完成的事情我不認爲聯合表是可以避免的。當然,這不應該阻止你!

我會向用戶表(即主持人或參與者)添加一個string類型的「角色」列,並使用has_and_belongs_to_many關聯。請注意,您需要創建包含:user_id:event_id列的聯合表users_events

然後,你可以有一個具有角色的用戶,讓我們說「主持人」,創建一個活動,然後邀請的角色「參與者」的其他用戶。

當然,這只是我的建議。有幾種方法可以解決這個問題。

0

我會處理用戶和事件之間has_many和belong_to。用戶has_many事件和事件belongs_to用戶。

其餘的將是你的邏輯。你想讓你的has_many關係成爲你的活動所有者或你的參與者。我會假設has_many與事件所有者有關。

從那裏在Event表中創建一個名爲參與者的列。在事件或用戶模型中,您可以創建一個插入參與者的user_id的before_save方法。

然後,您可以創建在返回事件的所有參與者的列表或者模型範圍。

1

請注意,如果事件has_many :users那麼用戶表必須有event_id列,並且用戶一次只能屬於一個事件。我懷疑你想在用戶和事件之間建立多對多的關係。如果是這種情況,你會使用has_and_belongs_to_many :users關聯記錄here

這就是說,是的,你可以在同一類上有多個關係。

class Event < ActiveRecord::Base 
    has_many :users 
    belongs_to :host, :class_name => 'User' 
end 

事件表將有一列host_id,但仍event.host將返回用戶。

相關問題