使用has_many关系创建setter方法时的association_id

时间:2015-08-06 16:29:18

标签: ruby-on-rails activerecord

我试图在setter方法中调用association_id(在我的情况下为site_id)属性,但是当使用has_many关系创建对象时,我得到nil。

网站有许多域,还有一个primary_domain。主域由primary_id属性确定。给定站点的所有域都具有相同的primary_id。

我的域类:

class Domain < ActiveRecord::Base
  belongs_to :site

  def is_primary=(bool)
    if bool
      self.save if !self.id.present?
      Domain.where(site_id: self.site_id).update_all(primary_id: self.id)
    end
    true
  end
end

我想做的是:

@site.domains.create(domain: "www.example.com", is_primary: true)

当我在self.site_id setter方法中调用is_primary=时,它返回nil。我似乎无法在setter方法中获得self.site_id,因为它没有明确指定。当然,我可以自己明确设置属性,但我觉得我错过了一些东西。我认为这应该是可能的,关于关系和Activerecord查询的rails约定以及所有。

那么,关于如何在此设置中获取site_id属性的任何想法?

1 个答案:

答案 0 :(得分:2)

混淆create的保存过程,中途打断它(通过在其中间调用save)并不是一个好主意。

只需回电:

class Domain < ActiveRecord::Base
  belongs_to :site

  attr_accessor :is_primary

  after_commit :set_primary, if: :is_primary

  def set_primary
    Domain.where(site_id: self.site_id).update_all(primary_id: self.id)
  end
end