Как использовать метод update_all в методе after_confirmation с помощью Devise Gem? - PullRequest
0 голосов
/ 28 января 2020

Как я могу обновить principle :status до true при создании нового принципа для конкретной школы, а также обновить предыдущие записи принципов :status как false этой школы.

У меня Principle модель:

class Principle < ApplicationRecord
    devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :confirmable
    belongs_to :school
    def default_values
        self.status = false
    end

    def active_for_authentication?
        super && status?
    end

    def after_confirmation
        Principle.update_all status: false
        self.update_attribute(:status, true)
    end
end

У меня School модель:

class School < ApplicationRecord
    has_many :principles, dependent: :destroy
end

Schema.rb:

    create_table "principles", force: :cascade do |t|
        t.datetime "created_at", precision: 6, null: false
        t.datetime "updated_at", precision: 6, null: false
        t.integer "school_id"
        t.boolean "status", default: false
        t.string "encrypted_password", default: "", null: false
        t.string "username"
        t.string "email"
        t.datetime "remember_created_at"
        t.datetime "reset_password_sent_at"
        t.string "reset_password_token"
        t.integer "failed_attempts"
        t.string "unlock_token"
        t.string "unconfirmed_email"
        t.datetime "confirmation_sent_at"
        t.datetime "confirmed_at"
        t.string "confirmation_token"
        t.index ["school_id"], name: "index_principles_on_school_id"
    end

В Principle модель after_confimation почты, я хочу обновить :status принципа последнего подтверждения до true и обновить :status до false предыдущих принципов этой школы.

1 Ответ

0 голосов
/ 28 января 2020

Измените это:

def after_confirmation
  Principle.update_all status: false
  self.update_attribute(:status, true)
end

на это:

def after_confirmation
school = self.school    # this line is not necessary, you can get rid of it
school.principles.update_all(status: false)
self.update_attribute(:status, true)
end
...