如何在ActiveRecord中删除具有相关记录的多个记录

pri*_*iya 5 activerecord ruby-on-rails

create table foo (id, name, order, ...);
create table foo_bar (id, foo_id, name, value);
Run Code Online (Sandbox Code Playgroud)

foo包含值为(1,2,3,4,5,... 10)的order列,假设foo_bar包含每个foo的多个记录.

如何删除订单值为3..6及其相关记录的foos?

Sal*_*lil 13

class Foo < ActiveRecord::Base
  has_many :foo_bars,  :dependent => :destroy
end

class FooBar < ActiveRecord::Base
  belongs_to  :foo
end
Run Code Online (Sandbox Code Playgroud)

如果您的关系如上所述,则以下代码将起作用

Foo.delete_all(["id in (?)", [3,4,5,6]])
Run Code Online (Sandbox Code Playgroud)

要不就

Foo.delete([3,4,5,6])
Run Code Online (Sandbox Code Playgroud)

参考删除

EDITED

从小知道我知道你的问题我认为你有类似跟随的东西

foo表

id  some_column    order
1   some_value      3
2   some_value      4
3   some_value      3
4   some_value      2
5   some_value      1
6   some_value      5
7   some_value      6
Run Code Online (Sandbox Code Playgroud)

foo_bar表

id  some_column    foo_id
1   some_value      2
2   some_value      1
3   some_value      3
4   some_value      2
5   some_value      4
6   some_value      5
7   some_value      6
Run Code Online (Sandbox Code Playgroud)

然后用户关注order而不是id

Foo.delete_all(["order in (?)", [3,4,5,6]])
Run Code Online (Sandbox Code Playgroud)

  • `delete`和`delete_all`不遵守关联中的`:dependent =>:destroy`选项.你应该使用`destroy`和`destroy_all`(具有性能影响) (5认同)
  • 请注意,这不是推荐的.做这样的事情是非常危险的,因为一个简单的错误,你可以删除一半的数据库(如果你有级联依赖=>销毁,像用户有很多文章,文章有很多评论等).建议的方法是将布尔标志"删除".此外,您可能希望以后创建统计信息,如果您只是删除它从未存在过的东西,那么您就没有这种可能性. (3认同)