【问题标题】:How do I delete multiple records with dependent records in ActiveRecord如何在 ActiveRecord 中删除具有依赖记录的多条记录
【发布时间】:2012-02-09 05:56:59
【问题描述】:
create table foo (id, name, order, ...);
create table foo_bar (id, foo_id, name, value);

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

如何删除 order 值为 3..6 的 foos 及其依赖记录?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:
    class Foo < ActiveRecord::Base
      has_many :foo_bars,  :dependent => :destroy
    end
    
    class FooBar < ActiveRecord::Base
      belongs_to  :foo
    end
    

    如果您的关系类似于上面的代码,则以下代码将起作用

    Foo.delete_all(["id in (?)", [3,4,5,6]])
    

    或者只是

    Foo.delete([3,4,5,6])
    

    参考delete

    已编辑

    我对你的问题知之甚少,我认为你有类似的关注

    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
    

    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
    

    然后用户关注order 而不是id

    Foo.delete_all(["order in (?)", [3,4,5,6]])
    

    【讨论】:

    • 忘了说这些值不是 id(s) 而是我表中的一个不同的整数列。
    • @priya,没关系。如果您有:dependent =&gt; :destroy,则相关记录将被删除。删除父记录的条件没有影响。好吧,它不应该有所作为。你试过这个吗?
    • @priya:- 检查我编辑的答案。
    • 请注意,这是不推荐的。做这样的事情是非常危险的,因为一个简单的错误,你可以删除一半的数据库(如果你有级联依赖 => 销毁,就像用户有很多文章,文章有很多 cmets 等)。建议的方法是使布尔标志“已删除”。此外,您可能希望稍后创建统计信息,如果您只是删除一些从未存在过的东西,您就不会有这种可能性。
    • deletedelete_all 不支持关联上的 :dependent =&gt; :destroy 选项。您应该使用destroydestroy_all(对性能有影响)
    【解决方案2】:

    正确答案,销毁(删除)依赖项:

    正如@Salil 所说,如果您的模型具有这样的dependent callback

    has_many :foo_bars,  :dependent => :destroy
    

    您要销毁父记录和从属记录的查询应该是:

    Foo.where(order: [1, 2, 3, 4]).destroy_all
    

    where 方法将获取所有具有orders 数组的记录,并为找到的每条记录调用destroy 方法。

    如果您不想执行有关销毁依赖项的回调,请使用 deletedelete_all

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 2016-06-10
      • 2012-05-11
      相关资源
      最近更新 更多