在Rails中验证关联的最佳方法是什么?

时间:2012-01-14 10:27:41

标签: ruby-on-rails activerecord

我有两个关联的模型:ApartmentLessor。我需要能够从Lessor表单创建Apartment

Apartment模型中:

belongs_to :lessor
before_save :save_lessor
...
def lessor_cellphone= val
  @cellphone = val
end
...
private
def save_lessor
  if Lessor.exists? :cellphone => @cellphone
    self.lessor = Lessor.find_by_cellphone @cellphone
  else
    self.create_lessor :cellphone => @cellphone
  end
  @cellphone = nil
end

Lessor模型中:

validates :cellphone, :format => {:with => /\d{11}/}, :uniqueness => true
has_many :apartments, :dependent => :nullify

但是当我尝试使用无效Apartment创建cellphone时,由于验证失败,因此未创建Lessor,但是已创建“公寓”。

验证cellphone(可能更多)并以Apartment形式提升错误的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

我认为可能更好的解决方案是使用accepts_nested_attributes_for通过另一种形式创建嵌套模型。

请参阅http://railscasts.com/episodes/196-nested-model-form-part-1http://asciicasts.com/episodes/196-nested-model-form-part-1了解文字版本。

但是,如果您想使用现有的解决方案: 如果您在false回调中返回before_*所有后续回调和相关操作都已取消,请参阅http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

所以我猜它会像

def create_lessor(data)
  # validate data here
  return false if # data not valid
end

def save_lessor
  rc = true
  if Lessor.exists? :cellphone => @cellphone
    self.lessor = Lessor.find_by_cellphone @cellphone
  else
    rc = self.create_lessor(:cellphone => @cellphone)
  end
  @cellphone = nil
  rc  # return the return code
end

这不是一个美丽的解决方案,但我认为你明白了......