2012-01-14 3 views
0

私は2つの関連するモデル:ApartmentLessorを持っています。そしてフォームからLessorを作成する必要があります。 LessorモデルでRailsで関連付けを検証する最良の方法は何ですか?

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 

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

しかし、私は無効cellphoneApartmentを作成しようとしたとき、検証が失敗したbecouse、Lessorが作成されていないが、 `アパートを作成するApartmentモデルで

フォームのcellphone(およびそれ以上)と上昇エラーを検証する最も良い方法は何ですか?

答えて

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は、あなたがあなたの既存のソリューションを使用する場合:あなたはすべての後にコールバックと関連付けられたアクションがキャンセルされbefore_*コールバックでfalseを返す場合は、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 

レあれば、それがすべてで美しい解決策ではないのですが、私はあなたのアイデアを得ると思います...

+0

存在していた賃貸人にアパートを関連付けすることが可能です'accepts_nested_attributes_for'を使用して、携帯電話のレコードがすでに存在していますか? –

+0

もちろん。新しいレコードが作成された場合、または既存のレコードが更新された場合も同じです。正しいレコードで 'ビルド 'するだけでよいのです。 – Vapire

関連する問題