2017-02-21 5 views
0

ソフト削除可能な電子メールの一意性を持つコンタクトモデルがあります。レイルは保存時にApplicationRecordインスタンスを置き換えます

誰かがsoft_deleted連絡先の電子メールで連絡先を作成しようとすると、この新しいインスタンスがソフト削除されたレコードになります。

例が明らか

contact = Contact.new(email: '[email protected]') 
contact.save # this got id = 1 
contact.soft_destroy 

# I expect contact2 to have id 1 
contact2 = Contact.new(email: '[email protected]') 
contact2.save 

# I was able to do it with create 

PSを作るために:私はこれの一部として保存この不気味な操作を行うことができので、もし私が実際に、nested_attributesなどの連絡先を作成しています、それは素晴らしいことです。

イベントにhas_manyはhas_oneのお問い合わせ

を招待私が得た最も近かったこの:

class Event < ApplicationRecord 
    accepts_nested_attributes_for :invites 

    before_save :restore_contacts 

    def restore_contacts 
    invites.each do |invite|  
     restorable_contact = Contact.find_by_email invite.contact.email 
     invite.contact = restorable_contact if restorable_contact 
    end 
    end 
end 

しかし、それは、このメソッドが実行される前に:(

+0

なりますnested_attributesを使用する必要がある場合は

contact = Contact.find_or_initialize_by email: "[email protected]" if contact.persisted? # email exists as Contact on DB # it needs some extra validation if contact.deleted_by_user_at.nil? # email is already in use else # contact was soft deleted contact.restore end else # email is free to use contact.save end 

連絡先が存在します 'restore_contacts'が動作します、そうですか?あなたは「私が行った最も近い」ということを説明できますか? – rogelio

+0

Ops、私の悪い、編集を参照してください –

+0

ソフト削除のためのいくつかの特定の宝石を使用していますか? – rogelio

答えて

0

あなたが言うように、接触の検証エラーを発生させますあなたがしなければならない最初の部分を解決するために(おそらく最良の選択ではないが、私は論理を説明しようとしている):

Contact odelは

# app/models/contact.rb 
class Contact < ApplicationRecord 
    validates :email, uniqueness: true 
    ... 
    def restore 
    self.update_attribute deleted_by_user_at, nil 
    # other actions ... 
    end 
    ... 
end 

その後、次のことができます。あなたが本当にあなたは/変更コードを追加する必要がありますが、ロジックは、私が思う同じ

関連する問題