Can I set up Cascade deleting in Rails?

后端 未结 5 728
情深已故
情深已故 2020-12-23 11:02

I know this is probably on the Internet somewhere but I can\'t find the answer here on Stackoverflow so I thought I may boost up the knowledge base here a little.

I\

相关标签:
5条回答
  • 2020-12-23 11:24

    It looks like this plugin might give you what you're looking for if you want the cascading deletes reflected in the actual database structure:

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

    Format for using this in a migration would be something like this:

    create_table :orders do |t|
      t.column :customer_id, :integer, :on_delete => :set_null, :on_update => :cascade
      ...
    end
    
    0 讨论(0)
  • 2020-12-23 11:28

    you can also set the :dependent option to :delete_all. :delete_all will issue a single SQL statement to delete all child records. because of this using :delete_all may give you better performance.

    has_many :memberships, dependent: :delete_all
    
    0 讨论(0)
  • 2020-12-23 11:36

    Just keep in mind that delete_all will not execute any callbacks (like before_destroy and after_destroy) on the child records.

    0 讨论(0)
  • 2020-12-23 11:42

    Yeah you can, if you are using a relationship like has_many you just do this

    has_many :memberships, dependent: :destroy
    
    0 讨论(0)
  • 2020-12-23 11:42

    Contrary to the provided answer I highly suggest also doing this on a database level. In case you have different processes or a multi threaded environment it could happen that records are not properly deleted. Furthermore the database foreign key makes things way faster when deleting lots of data.

    Like in the suggested answer do this:

    has_many :memberships, dependent: :delete_all
    

    However also make sure to setup a foreign_key in a migration. That way the database takes care of deleting the records automatically for you.

    To nullify the values when a membership is deleted, assuming you have a user model:

    add_foreign_key :users, :memberships, on_delete: :nullify
    

    You can also delete all the models whenever a membership is deleted

    add_foreign_key :users, :memberships, on_delete: :cascade
    
    0 讨论(0)
提交回复
热议问题