2016-04-07 21 views
0

我的機遇模型是這樣的:Rails的更新相關模型的對象

class Opportunity < ApplicationRecord 

# opportunity belongs to a user 
belongs_to :user 

def self.create_opportunity(params) 

    # Fetch opportunity params and user params from request parameters 
    opportunity_params = params[:opportunity_params] 
    user_params = params[:user_params] 

    opportunity = Opportunity.find_or_initialize_by(id: opportunity_params[:id]) 
    opportunity.assign_attributes(opportunity_params) 

    opportunity.user = User.find_or_initialize_by(email: user_params[:email]) 
    opportunity.user.assign_attributes(user_params) 

    opportunity.save 

end 

user.rb模型

class User < ApplicationRecord 

    # validate user email 
    validates :email, presence: true, email: true 
    enum gender: { male:1, female:2 } 

end 

我們創建了一個新的用戶,如果所提供的電子郵件地址的用戶不存在。這在創建新用戶時運行良好,但在已有用戶時不起作用。用戶模型的更新不起作用。 對於用戶更新工作,我需要具體撥打opportunity.user.save

任何想法如何使這項工作沒有顯式調用保存在用戶模型?

回答

0

使用此行,您可以創建一個新用戶(如果它不存在並更新其數據)。

opportunity.user.find_or_create_by(email: user_params[:email]).update(user_params) 

如果用戶已更新或不更新,此方法將返回true/false。如果你希望用戶自己創建的使用:

opportunity.user.find_or_create_by(email: user_params[:email]).tap{ |user| user.update(user_params) } 

編輯: 這工作:

opportunity.user = User.find_or_create_by(email: user_params[:email]).tap{ |user| user.update(user_params) } 
+0

產生以下錯誤:未定義的方法'find_or_create_by」爲#<用戶:0x007fc108039f78> –

+0

用戶是子ActiveRecord :: Base ?? http://apidock.com/rails/v4.0.2/ActiveRecord/Relation/find_or_create_by –

+0

是的,添加User.rb –