[ruby-on-rails] Rails에서 캐스케이드 삭제를 설정할 수 있습니까?

나는 이것이 아마도 인터넷 어딘가에 있다는 것을 알고 있지만 여기 Stackoverflow에서 답을 찾을 수 없으므로 여기에서 지식 기반을 조금 높일 수 있다고 생각했습니다.

저는 Ruby와 Rails의 초보자이지만 제 회사는 그것에 대해 꽤 투자하고 있으므로 조금 더 자세히 알아 보려고 노력하고 있습니다.

데이터베이스가 아닌 “모델”에서 응용 프로그램을 디자인하는 것에 대한 마음가짐을 바꾸는 것이 어려웠 기 때문에 데이터베이스에서 고전적으로 수행 한 모든 디자인 작업을 대신 Rails 모델.

그래서 내가 나에게 준 가장 최근 작업은 계단식 삭제를 수행하도록 Rails 데이터베이스 모델을 구성하는 방법을 알아내는 것입니다. 이 작업을 수행하는 쉬운 방법이 있습니까? 아니면 MySql로 가서 이것을 설정해야합니까?



답변

: dependent 옵션을 : delete_all로 설정할 수도 있습니다. : delete_all은 모든 하위 레코드를 삭제하는 단일 SQL 문을 실행합니다. 이 때문에 : delete_all을 사용하면 더 나은 성능을 얻을 수 있습니다.

has_many :memberships, dependent: :delete_all


답변

예, 할 수 있습니다. has_many와 같은 관계를 사용하는 경우 이렇게하면됩니다.

has_many :memberships, dependent: :destroy


답변

제공된 답변과 달리 데이터베이스 수준에서이 작업을 수행하는 것이 좋습니다. 다른 프로세스 또는 다중 스레드 환경이있는 경우 레코드가 제대로 삭제되지 않을 수 있습니다. 또한 데이터베이스 외래 키는 많은 데이터를 삭제할 때 일을 더 빠르게 만듭니다.

제안 된 답변 에서처럼 다음을 수행하십시오.

has_many :memberships, dependent: :delete_all

그러나 foreign_key마이그레이션에서 a 를 설정해야 합니다. 이렇게하면 데이터베이스가 자동으로 레코드를 삭제합니다.

사용자 모델이 있다고 가정하고 멤버십이 삭제 될 때 값을 무효화하려면 다음을 수행하십시오.

add_foreign_key :users, :memberships, on_delete: :nullify

멤버십이 삭제 될 때마다 모든 모델을 삭제할 수도 있습니다.

add_foreign_key :users, :memberships, on_delete: :cascade


답변

delete_all은 하위 레코드에 대한 콜백 (예 : before_destroy 및 after_destroy)을 실행하지 않습니다.


답변

계단식 삭제가 실제 데이터베이스 구조에 반영되도록하려면이 플러그인이 원하는 것을 제공 할 수 있습니다.

http://www.redhillonrails.org/foreign_key_migrations.html

마이그레이션에서 이것을 사용하는 형식은 다음과 같습니다.

create_table :orders do |t|
  t.column :customer_id, :integer, :on_delete => :set_null, :on_update => :cascade
  ...
end


답변