【问题标题】:Mass delete has_many associated rows in Rails在 Rails 中批量删除 has_many 关联的行
【发布时间】:2011-04-22 01:00:23
【问题描述】:

我有一个模型 Foo 和一个模型 Bar,两者都有 has_many :bar_foos (然后是彼此的 has_many :through => :bar_foos)。通过 BarsFoo 模型,这是 Foo 和 Bar 之间简单的多:多关系。

我想删除 bar_foos 表中的几行。具体来说,我想删除与任何给定 Foo 集和任何给定 Bars 集相关的任何 bar_foo 记录。为了提高性能,我想发出一个数据库调用来执行此操作。

对应的 SQL 语句为:

DELETE FROM bar_foos WHERE bar_id IN ( ?, ?, ? ) AND foo_id in ( ?, ?, ? )

...同时用适当的 ID 替换 ?s。

如何使用 Rails 2.3.x 执行此操作?

理想情况下,我不会自己编写实际的 SQL,而是调用 ActiveRecord 方法。但是,我怀疑这是否存在。

除此之外,我将自己编写 SQL 语句,但是:

  • 我想避免在 SQL 字符串中硬编码表/列名
  • 我想使用某种自动(即:可靠)方法来转义 SQL 参数而不是仅连接字符串。

【问题讨论】:

    标签: sql ruby-on-rails activerecord


    【解决方案1】:

    我认为使用关联是不可能的,您必须自己编写(使用destroy_all

    BarFoo.destroy_all(["bar_id IN (?) AND foo_id in (?)", bar_id_array, foo_id_array]) 
    

    【讨论】:

    • 很好,我担心我必须连接各个占位符。
    【解决方案2】:

    你可以这样做...

    has_many :bar_foos, :dependent => destroy
    

    这将销毁属于刚刚销毁的对象的所有 bar_foos。

    【讨论】:

    • 哦,我明白了……只有当 Foo 和 Bar 被破坏时,你才想这样做……我说得对吗?
    • 其实,没有。我不想破坏 Foos 或 Bars 本身,我只想解除它们的关联。
    猜你喜欢
    • 2012-07-09
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多