2017-08-11 92 views
0

在Rails 5我有我的模型設置是這樣的:軌5有許多模式

User 
has_many :events, :through => :participants 
Event 
    has_many :participants 
    has_many :users, :through => :participants 
Participant 
    belongs_to :user 
    belongs_to :event 

當我創建一個事件,我送user_ids和新的參與者而成。

但是,現在當我想創建新事件時,可能還沒有創建特定的用戶。

什麼是一種很好的模式來檢查用戶是否不存在,然後在將用戶ID添加到事件之前創建所述用戶?

user = User.find_or_create_by(email: email) event.users << user

應該在哪裏發生的呢?

+1

一個建議,使用'通過::參與者'而不是':通過=>:參與者' – dendomenko

回答

1

的良好格局來檢查,如果用戶不存在

有很find_or_initialize_byfind_or_create_by方法這一點。

如果用戶通過他們的電子郵件訂閱:

event.users.find_or_create_by(email: email) 

這會找到或創建一個用戶,然後訂閱事件。

+0

哪裏纔是正確的地方呢?哪種型號回調? – gibo

+0

這取決於您的應用程序的邏輯。您可以隨時在控制器中執行它,因爲在控制器中有「參數」,根據這個參數可以決定用戶是否存在。如果邏輯對於控制器操作變得太複雜,我建議將它移動到服務對象中。但我會避免將邏輯放入模型回調 –

+1

順便說一句,我更新了我的答案。我記得,可以直接在關聯上調用'find_or_create_by'。 –

0

什麼自定義的驗證:

event.rb 
validate :has_users 

def has_users 
    errors.add(:base, 'add at least one user') if self.users.blank? 
end