在创建/保存模型记录之前设置关联ID

时间:2013-08-21 13:23:06

标签: ruby-on-rails ruby

我希望在我的模型中有一个before_create方法,它将检查模型是否与另一个模型(用户)有关联/关系,并在关系为nil时设置它。

问题是我不知道为什么不会执行以下条件,尽管user和user_id变量都是nil。

关系是:

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和user是nil。我也试过像self.user.nil一样使用自己的前缀?等等。

尽管执行了check_user_id方法,为什么永远不会满足条件? 在创建新线索时设置此关系的最佳方法是什么?

在Campaign下创建潜在客户,因此应正确设置用户关联:

c = Campaign.new
l = c.leads.new
l.email = 'test@test.com'
l.save

感谢您的帮助!

1 个答案:

答案 0 :(得分: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以获取解释。