Каков наилучший способ проверки ассоциации в Rails? - PullRequest
0 голосов
/ 14 января 2012

У меня есть две связанные модели: Apartment и Lessor.И мне нужно иметь возможность создавать 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 Ответ

2 голосов
/ 14 января 2012

Я думаю, что, возможно, лучшим решением было бы использование accepts_nested_attributes_for для создания вложенной модели в форме другой.

См. http://railscasts.com/episodes/196-nested-model-form-part-1 или http://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

В общем, это не красивое решение, но я думаю, вы поняли ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...