2017-08-11 59 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