논리적 삭제 정보

9206 단어 RubyRails

제가 이 기사를 쓴 계기가 되고 싶어요.


초보자에게 말할 기회가 생겨 논리 삭제에 대해 이야기할 때 자료를 준비했다.깜짝 놀랄 것도 많이 남기고 어렵게 기사를 쓴 경우도 있었다.

컨텐트


논리적 삭제 정보

독자 대상


"CRUD는 쓸 수 있지만 논리적 삭제는 정확하지 않다"를 대상으로 한다.
학교 같은 데서도 잘 안 닿는 것 같은데.스케줄러:소박해서그런가?

논리적 삭제란


데이터를 삭제할 때 저장 매체에서 데이터를 삭제하는 것이 아니라 삭제된 것처럼 처리하는 것을 논리적 삭제라고 한다.실제 삭제를 물리적 삭제라고 합니다.
조작에 오류가 있어도 데이터가 사라지지 않아 원상태로 복구할 수 있고 분석할 때도 데이터를 저장할 수 있어 편리하다.

논리적 삭제


'이 데이터가 논리적으로 삭제되었는지' 를 관리할 표지판을 준비하십시오.
열명은 무엇이든지 가능하지만 deleted 등으로는 진가 값으로 값을, deleted_at의 이름을 시간으로 찌르는 등 다양한 방법이 있다."몇 시쯤 잘못됐어요. 대량으로 삭제했는데 복구할 수 있을까요?"이럴 때 대응하면 타임 스탬프를 사용하는 것이 편리할 수 있다.
열을 준비하면 로고가 세워진 물건을 직접 삭제한 것처럼 보인다.
이번에는 샘플 응용 프로그램을 만지작거리는 형식으로 진행할 것이다.로고를 삭제하는 것은 편의를 위해 flag라는 이름으로 진위를 표시하는데 당연히 좋은 이름은 아니다.마음에 드는 이름과 모델을 시도해 보세요.

어플리케이션 준비

[app_name]에 좋아하는 프로그램 이름을 붙여 주세요.
이번에는 이름과 로고만 삭제된 User를 만들었다.
초기 형태 생성하기
rails new [app_name] 
cd [app_name]
rails g scaffold User name:string flag:boolean
rails db:migrate
서버 시작
rails server
다음을 참조하십시오.
http://localhost:3000/users

이런 화면이 나오면 준비가 완료된다.

사용자 등록


그럼 두 명의 사용자를 등록하세요.한 사람은 검사flag하고, 다른 한 사람은 놓지 않는다.

사용자 A의 삭제 플래그가 진짜로 설정되어 있습니다.지금부터 A가 사라지지 않은 것처럼 보이도록 코드를 수정합니다.

A 를 삭제된 것처럼 처리하다


이번에는 indexdestroy 두 곳을 개작할 것이다.

다시 쓰기 인덱스


컨트롤러index의 위치를 보십시오.
users_controller.rb
class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]
  # GET /users
  # GET /users.json
  def index
    @users = User.all  
  end
A는 논리에 의해 삭제된 사용자이기 때문에 보이지 않으려고 한다.삭제된 태그가 없는 사용자를 다시 써 보십시오.
이렇게 다시 쓰다
def index
   @users = User.where(flag: false)
end

보아하니 A가 삭제된 것 같다.

다시 쓰기 삭제

scaffold에서destroy는 동작이 물리적 삭제이기 때문에 다시 쓴다.간단하게 로고를 trueupdate로 설정합니다.
users_controller.rb

def destroy
    @user.destroy #@user.update(flag: true)に変更
    respond_to do |format|
      format.html { redirect_to users_url, notice: 'User was successfully
destroyed.' }
      format.json { head :no_content }
    end
end
private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
end
@user의 내용은 잘 모르겠지만, 호출할 때set_user는 호칭이 있는데, 그 안에는 User.find(params[:id])가 있다.

삭제 시도


그럼 B도 지워봐요.화면에서 예쁘게 사라져 보였어요.
 
단지 화면에서 볼 수 없을 뿐, 당연히 데이터는 존재한다.확인해 볼게요.
내용을 확인하다
irb(main):001:0> User.all
=> #<ActiveRecord::Relation [#<User id: 1, name: "user A", flag: true,
created_at: "2020-03-29 09:30:59", updated_at: "2020-03-29 09:30:59">, #<User
id: 2, name: "User B", flag: true, created_at: "2020-03-29 09:31:09",
updated_at: "2020-03-29 09:43:01">]>

역할 영역 사용


이번 샘플User.where(flag: false)은 논리적으로 삭제되지 않은 사용자를 얻었다.
'삭제되고 싶지 않은 논리 가져오기' 를 여러 번 사용해야 하기 때문에, 역할 영역에서 잘라내는 것이 비교적 편리하다.
이번 이슈와 직접적인 상관은 없지만, 제작 범위에서 사전 결합 등 특정 조건이 있어야만 효과를 발휘할 수 있는 것을 만들지 않도록 주의해달라.(언제든지 사용할 수 있을 줄 알았는데 다른 사람들은 무심코 사용했다.)
기술한 곳은 모형이다.간단하게 쓰기 방법을 소개하면 됩니다.
scope :名前, -> {検索条件}
논리가 삭제되지 않은 사용자를 활성 사용자로 삼아 다음과 같은 내용을 써 보았다.
user.rb
class User < ApplicationRecord
  scope :active, -> { where(flag: false) }
  scope :deleted, -> { where(flag: true) }
end
자세한 내용은 이쪽을 보세요.
Active Record 쿼리 인터페이스

재작성 컨트롤러


마지막으로 현재 제작된 범위를 이용하여 컨트롤러를 고쳐 봅시다.
users_controller.rb

def index
  @users = User.active
end

실제 사용 시


실제 응용 프로그램에 논리 삭제를 넣었을 때 이번 샘플 외에 수정해야 할 부분이 있었다.

다른 동작도 지원됩니다.


이번에는 간단한 샘플이기 때문에 보기indexdestroy만 하고 다른 동작도 가공해야 한다.(직접 경로를 입력하여 들어갈 때'존재하지 않는 사용자입니다'등의 정보를 보내고 목적지 리디렉션을 준비하는 등)

삭제됨


알 수 없는 상황에서 로고를 삭제한 열의 값은 true,false,nil 세 가지가 될 수 있다.그렇게 되지 않도록 default: false 등에서 초기값을 확실히 준비하고 검증nil을 준비하거나 논리적으로 삭제된 사용자의 획득 방법에 공을 들여야 한다.
만약 삭제 로고가 nil의 사용자 C라면 이번 코드는 삭제된 것도 아니고 활성화된 것도 아니다.콘솔로 확인해 볼게요.
irb(main):001:0> User.active
=> #<ActiveRecord::Relation []>

irb(main):002:0> User.deleted
=> #<ActiveRecord::Relation
[#<User id: 1, name: "user A", flag: true, created_at: "2020-03-29 09:30:59", updated_at: "2020-03-29 09:30:59">, 
#<User id: 2, name: "User B", flag: true, created_at: "2020-03-29 09:31:09", updated_at: "2020-03-29 09:43:01">]>

irb(main):003:0> User.all
=> #<ActiveRecord::Relation
 [#<User id: 1, name: "user A", flag: true, created_at: "2020-03-29 09:30:59", updated_at: "2020-03-29 09:30:59">,
#<User id: 2, name: "User B", flag: true, created_at: "2020-03-29 09:31:09", updated_at: "2020-03-29 09:43:01">,
 #<User id: 3, name: "User C", flag: nil, created_at: "2020-05-04 19:03:27", updated_at: "2020-05-04 19:03:27">]>

끝맺다


도움이 됐으면 좋겠어요.감사합니다.

좋은 웹페이지 즐겨찾기