2012-01-14 3 views
0

У меня есть две связанные модели: Apartment и Lessor. И мне нужно создать Lessor от Apartment формуляра.Каков наилучший способ проверки ассоциации в Rails?

В 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 не создается becouse проверка не пройдена, но `квартира создана ,

Каков наилучший способ проверки cellphone (и, возможно, больше) и ошибки при подъеме в форме Apartment?

ответ

2

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

См. http://railscasts.com/episodes/196-nested-model-form-part-1 или http://asciicasts.com/episodes/196-nested-model-form-part-1 для текстовой версии.

Nontheless, если вы хотите использовать существующие решения: Если вы возвращаете 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 

это не красивое решение AT ALL, но я думаю, вы получите идею ...

+0

можно ли связать квартиру существовала арендодатель, если лес запись сотового телефона уже существует, используя «accepts_nested_attributes_for»? –

+0

Конечно. При создании новой записи или изменении существующей записи ничего не меняется. Вам просто нужно убедиться, что «построите» его с правильной записью. – Vapire

Смежные вопросы