2016-10-12 16 views
0
namespace :send_query do  
    task :to_admins => :environment do 
     contacts = Contact.select(:name, :mobile, :company, :requirement).where(email_sent: false).distinct 
     if !contacts.blank? 
      contacts.each do |contact| 
       GuestMailer.query_email(contact.name, 
      contact.mobile, 
      contact.company, 
      contact.requirement).deliver 
      contact.update!(email_sent: true) 
      end 
     end 
     puts "done sending query emails" 
    end 
end 

私は電子メールを送信するレーキタスクを書きました。電子メールを送信した後、email_sentフィールドをtrueに更新しています。しかし、トランザクションは電子メールを送信した後にロールバックしています。ここで名前の検証のためにレコードを更新できません

(0.2ms) BEGIN 
    Contact Exists (0.7ms) SELECT 1 AS one FROM "contacts" WHERE "contacts"."name" = $1 AND ("contacts"."id" IS NOT NULL) AND "contacts"."mobile" = $2 AND "contacts"."requirement" = $3 AND "contacts"."company" = $4 LIMIT $5 [["name", "vamsi pavan mahesh"], ["mobile", "9247474925"], ["requirement", "yo yo honey singhu"], ["company", "[email protected]"], ["LIMIT", 1]] 
    (0.2ms) ROLLBACK 
rake aborted! 
ActiveRecord::RecordInvalid: Validation failed: Name has already been taken 

は、連絡先のモデル、あなたのContactモデルに

# == Schema Information 
# 
# Table name: contacts 
# 
# id   :integer   not null, primary key 
# name  :string 
# mobile  :string 
# company  :string 
# requirement :text 
# created_at :datetime   not null 
# updated_at :datetime   not null 
# email_sent :boolean   default(FALSE) 
# 

class Contact < ApplicationRecord 
    validates :name, presence: true 
    validates :mobile, presence: true 
    validates :requirement, presence: true 
    validates_uniqueness_of :name, scope: [:mobile, :requirement, :company] 
end 
+0

妥当性検査をバイパスするには、あなたができることができます。 'contact.update_attribute(:email_sent、true)' –

+0

私は検証が必要です! – gates

+1

これは私がバリデーションで気に入らないものです:あなたのレコードを保存した後、別のバリデーションを追加してこの古いレコードがこのバリデーションに合格できなくなったら、それ以上アップデートすることはできません。検証が失敗するような属性を変更しなくても有効です。彼の回避策は、バリデーションの 'if'条件を使用することです:' validates:name、uniqueness:{scope:[:mobile、:requirement、:company]}、 'self.name_changed?'の場合 – MrYoshiji

答えて

0

である、あなたはon: :createを行うことができますし、それが唯一の作成アクションにその検証を適用します。

validates :name, presence: true, on: :create

EDIT:

MrYoshijiはコメントで指摘したように、それは、検証エラーの原因となっている名前のuniqueness検証ですので、修正は実際に次のようになります。

validates :name, uniqueness: { scope: [:mobile, :requirement, :company] }, on: :create

+0

あなたは 'validates:名前、一意性:{scope:[:mobile、:requirement、:company}}、on::create'を意味すると思います。失敗した検証は名前の存在ではなく名前の一意性に関するものです。 – MrYoshiji

+0

ああ、はい、それは正しいです。私は、吉吉さんの答えに自分の答えを更新します。 – PelagicDev

関連する問題