2013-10-22 20 views
0

我有三個模型(MessageUserRecipient)。我有Message的方法,目前看起來是這樣的:以簡明的方式添加收件人郵件w/Ruby

def add_recipient(emails) 
    emails.split(' ').map do |email| 
    user = User.where(email: email).first_or_create 
    user.persisted? ? user : nil 
    end.compact.map do |user| 
    recipient = Recipient.new(message: self, user: user) 
    recipients << recipient 
    recipient 
    end 
end 

基本上,它可以採取一個或多個電子郵件(用空格隔開),試圖找到或創建一個有效的用戶瓦特/它(該剝離掉任何無效的電子郵件),然後將它們作爲收件人添加到郵件中。

這個工程,但我覺得這是非常醜陋的。我能做些什麼來重構這種方法?

回答

0

重構建議?好的,我們開始吧!

  1. 顯示意圖:如果添加多個收件人,請將其重命名爲add_recipients(複數)。
  2. 單一職責:在此操作中,find_or_create用戶真的是個好主意嗎?你如何報告電子郵件無效?

    代碼讀者也不清楚爲什麼你檢查persisted?至少需要一些評論。正因爲如此,我會在其他地方處理此登錄,並簡單地將用戶列表傳遞給該方法。

  3. 使用關聯方法:您可以在關聯代理(如self.recipients.build)上調用buildcreate

寫了這一切,我的代碼看起來完全不同:

users = User.where(email: emails.split(' ')) 
users.each { |user| message.recipients.build(user: user) } 
+0

原因first_or_create是,如果這是用戶第一次嘗試將消息發送到用戶,他們AREN在我們的系統中,我們將創建一個用戶記錄,然後他們將在登錄後聲明。 –

相關問題