2013-08-21 104 views
0

我想在我的模型中有一个before_create方法,它将检查模型是否与另一个模型(用户)有关联/关系,并在关系为零。在创建/保存模型记录之前设置关联ID

问题是,我不知道为什么下面的条件不会被执行,尽管用户和user_id变量为零。

的关系是:

User has_many :Leads 
Campaign has_many :Leads 
Lead belongs_to :User and :Campaign 

这里的型号导线代码:

class Lead < ActiveRecord::Base 
    attr_accessible :email 

    belongs_to :popup 
    belongs_to :campaign 


    validates :email, presence: true, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i } 

    before_create :check_user_id 

private 
    def check_user_id 
    puts "check user id: #{user_id}" 
    puts self.user_id 
    puts user_id 
    puts user 
    if self.user.blank? 
     "set user id" 
     user_id = campaign.user_id if campaign 
    end 

    end 

end 

的问题是,self.user.blank?条件永远不会被满足。如果我尝试user.nil?或者除非用户我总是得到相同的东西,即使user_id和用户都是零。我也尝试使用self.user.nil这样的自我前缀?等等。

虽然执行check_user_id方法,但为什么条件永远不会满足? 创建新潜在客户时,设置此关系的最佳方式是什么?

牵头下创建活动,使用户协会应正确设置:

c = Campaign.new 
l = c.leads.new 
l.email = '[email protected]' 
l.save 

感谢您的帮助!

回答

1

您需要使用self才能正常工作。

def check_user_id 
    # snip... 
    if self.user.blank? 
     user_id = campaign.user_id if campaign 
    end 
    end 

这是告诉方法check_user_id创建名为user_id一个局部变量。相反,您需要分配instance.user_id

self.user_id = campaign.user_id if campaign 

有关说明,请参阅this answer

+0

谢谢你的答案..它现在的工作!有没有更好的方法来自动设置关系分配?也许是:通过设置模型关系? – Aljaz

+0

您的代码非常短的版本是:'self.user_id || = campaign.try(:user_id)'(一行) – MrYoshiji

相关问题